java中的socket编程

本文介绍了Java中的Socket编程,包括客户端和服务端的实现,多线程服务器,交互式Socket,代理和SOCKS5协议的使用,以及如何设置用户名和密码进行验证。示例代码简洁明了,帮助理解Socket通信的基本过程。
摘要由CSDN通过智能技术生成

随便玩玩

本周末研究了一会儿java的socket编程,由于java web开发往往使用servlet等应用层的类库和框架,因此个人兴趣,想研究一下传输层的内容。

socket client

首先简单的,使用java的socket编程建立一个客户端,能够访问服务器相应内容。
简单的几行代码如下:

//initial socket client, set host, port and time out interval
Socket client = new Socket("127.0.0.1", 9999);
client.setSoTimeout(10000);

两行代码基本上建立了一个socket通道。其中host入参可以是IP或hostname。

可以通过下列两行代码获取socket的输入、输出流

//get socket client output stream
PrintStream socketOut = new PrintStream(client.getOutputStream());

//get socket client input stream
BufferedReader socketIn = new BufferedReader(new InputStreamReader(client.getInputStream()));

获取输入、输出流之后,即可通过一般的流操作进行socket通信。

通信结束后记得将输入、输出流以及socket关闭

// close input stream, output stream and socket
socketIn.close();
socketOut.close();
client.close();

最好将上述代码try catch住,在finally块中进行一次判断,完全保证成功关闭。

socket server

有了客户端可能找不到合适的服务端进行实验,那就自己建立个socket server。
仍旧是短短几行代码:

// initial socket server
ServerSocket server = new ServerSocket(9999);
// receive an socket connection
Socket client = server.accept();

如上述代码,指定端口号即可创建一个ServerSocket,该server会处于监听状态,每当有client连接时,accept()方法会返回请求的client socket。
获取输入、输出流的代码与上一节一样。这个socket的在server端的输入流对应client端的输出流,server端的输出流对应client端的输入流,如下:
fcb4fb28-1a00-46b4-a90e-9081d6fc19c0.png

同样在结束时需要关闭输入、输出流,及socket。

多线程server

上述server没有什么实用性,收到一个client连接,通信完成后即结束,这样的server基本没什么用。
因此一般的server应该每收到一个请求,就创建一个线程去处理,同样几行代码即可完成:

public class SocketServerThread implements Runnable {
   

    private Socket              client;

    public SocketServerThread(Socket client) {
        this.client = client;
    }

    @Override
    public void run() {
        // code here
    }
}
// start a new thread to process this socket
SocketServerThread thread = new SocketServerThread(client);
new Thread(thread).start();

这样做才是一个正常服务器应有的功能,对每个请求并行处理,如下:
7a16d25b-8a38-4de7-90d5-c66b93d7239a.png

交互式socket

这是一个有趣的demo,从console输入内容,发送给server,回显server返回的内容。输入”exit”,则关闭socket。
还是简单的几行代码:
client端:

//get system input
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

// continue if flag is true, exit otherwise
boolean flag = true;

while (flag) {
    System.out.println("Please input : ");

    // get system input by user
    String str = input.readLine();

    //send content to socket
    socketOut.println(str);

    //
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值