在编写代理服务器之前,首先应该明白一点,Java的代理机制,如图所示:
那么Java就处于中间这层代理服务器,代理服务器所作的事情如下:
1、接收客户端请求,进行处理,然后发送给服务端
2、接收服务端响应,进行处理,然后发送给客户端
这样,就更清晰了,Java提供了代理的API为,java.net.Proxy类。此类表示代理设置,通常为类型(http、socks)和套接字地址。Proxy 是不可变对象。
也就是说Java可以制作高级协议的代理,如 HTTP 或 FTP。也可以制作SOCKS(V4 或 V5)代理。
首先,使用到了URL类,HttpURLConnection类及其我们的代理类Proxy类。他们都位于java.net包中。
第一步:生成代理,指定端口为8888:
第二步:使用URLConnection类进行连接www.moonsos.com
第三步:打开URL,并且读取HTML源码
//引入必要的命名空间
using
System
using
System.Collections.Generic
using
System.ComponentModel
using
System.Data
using
System.Drawing
using
System.Text
using
System.Windows.Forms
using
System.Runtime.InteropServices
//
提供DllImport等特性,是P/Invoke的关键
namespace
test
{
public
partial
class
Form1
:
Form
{
public
Form1()
{
InitializeComponent()
}
//
这个结构体将会传递给API。使用StructLayout(...特性,确保其中的成员是按顺序排列的,C#编译器不会对其进行调整。
[StructLayout(LayoutKind.Sequential,
Pack
=
1)]
internal
struct
TokPriv1Luid
{
public
int
Count
public
long
Luid
public
int
Attr
}
//
以下使用DllImport特性导入了所需的Windows
API。
//
导入的方法必须是static
extern的,并且没有方法体。调用这些方法就相当于调用Windows
API。
[DllImport("kernel32.dll",
ExactSpelling
=
true)]
internal
static
extern
IntPtr
GetCurrentProcess()
[DllImport("advapi32.dll",
ExactSpelling
=
true,
SetLastError
=
true)]
internal
static
extern
bool
OpenProcessToken(IntPtr
h,
int
acc,
ref
IntPtr
phtok)
[DllImport("advapi32.dll",
SetLastError
=
true)]
internal
static
extern
bool
LookupPrivilegeValue(string
host,
string
name,
ref
long
pluid)
[DllImport("advapi32.dll",
ExactSpelling
=
true,
SetLastError
=
true)]
internal
static
extern
bool
AdjustTokenPrivileges(IntPtr
htok,
bool
disall,
ref
TokPriv1Luid
newst,
int
len,
IntPtr
prev,
IntPtr
relen)
[DllImport("user32.dll",
ExactSpelling
=
true,
SetLastError
=
true)]
internal
static
extern
bool
ExitWindowsEx(int
flg,
int
rea)
//
以下定义了在调用WinAPI时需要的常数。这些常数通常可以从Platform
SDK的包含文件(头文件)中找到
internal
const
int
SE_PRIVILEGE_ENABLED
=
0x00000002
internal
const
int
TOKEN_QUERY
=
0x00000008
internal
const
int
TOKEN_ADJUST_PRIVILEGES
=
0x00000020
internal
const
string
SE_SHUTDOWN_NAME
=
"SeShutdownPrivilege"
internal
const
int
EWX_LOGOFF
=
0x00000000
internal
const
int
EWX_SHUTDOWN
=
0x00000001
internal
const
int
EWX_REBOOT
=
0x00000002
internal
const
int
EWX_FORCE
=
0x00000004
internal
const
int
EWX_POWEROFF
=
0x00000008
internal
const
int
EWX_FORCEIFHUNG
=
0x00000010
//
通过调用WinAPI实现关机,主要代码再最后一行ExitWindowsEx,这调用了同名的WinAPI,正好是关机用的。
private
static
void
DoExitWin(int
flg)
{
bool
ok
TokPriv1Luid
tp
IntPtr
hproc
=
GetCurrentProcess()
IntPtr
htok
=
IntPtr.Zero
ok
=
OpenProcessToken(hproc,
TOKEN_ADJUST_PRIVILEGES
|
TOKEN_QUERY,
ref
htok)
tp.Count
=
1
tp.Luid
=
0
tp.Attr
=
SE_PRIVILEGE_ENABLED
ok
=
LookupPrivilegeValue(null,
SE_SHUTDOWN_NAME,
ref
tp.Luid)
ok
=
AdjustTokenPrivileges(htok,
false,
ref
tp,
0,
IntPtr.Zero,
IntPtr.Zero)
ok
=
ExitWindowsEx(flg,
0)
}
private
void
button1_Click(object
sender,
EventArgs
e)
{
if
(radioButton1.Checked
==
true)
{
DoExitWin(EWX_SHUTDOWN)
}
else
{
Application.Exit()
}
//MessageBox.Show("2")
}
}
}
服务器端代码while 1:
buf = s.recv(1024)
改成
while 1:
buf = conn.recv(1024)
看看能不能接收到信息
--------------
貌似你的服务端代码 俩个while 1 有点问题
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)