随便玩玩
本周末研究了一会儿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端的输入流,如下:
同样在结束时需要关闭输入、输出流,及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();
这样做才是一个正常服务器应有的功能,对每个请求并行处理,如下:
交互式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);
//