想用java编写个代理服务器,求具体一些思路,详细一些,谢谢

想用java编写个代理服务器,求具体一些思路,详细一些,谢谢,第1张

在编写代理服务器之前,首先应该明白一点,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 有点问题


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/88165.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-06
下一篇2023-03-06

发表评论

登录后才能评论

评论列表(0条)

    保存