发送数据的Socket Client端
创建一个Socket类用来连接Server。
localhost
就是本机的地址,也可以换成远程的ip。4001是Server打开的Socket的端口号:Socket socket = new Socket("localhost", 40001);
用一个PrintStream 类作为中介发送数据:
PrintStream ps = new PrintStream(socket.getOutputStream()); ps.print("hello world");
记得关闭Socket连接:
socket.close();
接收数据的Socket Server端
创建一个ServerSocket类,端口号设置为40001,就是Client的目标端口。可以自己设,只要Server和Client的端口一致且不和其它应用程序发生冲突就行:
ServerSocket server = new ServerSocket(40001);
然后开始等待接收数据:
Socket socket = server.accept();
接收到数据就执行后面的语句,输出下吧:
InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); System.out.println(br.readLine());
输出如下。输出的
hello world
可不是这个Server产生的哦,而是从Socket的Client发送过来的数据:
别忘了关闭socket连接:
server.close();
多线程的Server
上面的Server端只能同时接收一个Client发过来的数据。如果有多个Client来请求数据怎么办呢?那就用多线程咯。
初始化:
ServerSocket server = new ServerSocket(port); HandleThread[] handles = new HandleThread[3]; // 允许三个Client接入
来一个accept就创建一个HandleThread线程:
for (int i = 0; i < handles.length; ++i) { handles[i] = new HandleThread(server.accept()); System.out.println("\n------a new client connect success------"); handles[i].start(); }
等待这三个线程:
for (HandleThread handle : handles) { if (handle.isAlive()) { handle.join(); } }
HandleThread的工作就是输出传过来的数据:
class HandleThread extends Thread { private Socket handle; private InputStream in; private OutputStream out; public HandleThread(Socket accept) throws IOException { this.handle = accept; this.in = accept.getInputStream(); this.out = accept.getOutputStream(); } @Override public void run() { final int bufLen = 65535; byte[] buf = new byte[bufLen]; // 缓冲区 int realLen; try { while ((realLen = this.in.read(buf, 0, bufLen)) > 0) { System.out.println(new String(buf, 0, realLen)); // 输出 } System.out.println("------connection closed------"); } catch (IOException e) { e.printStackTrace(); } // 关闭 try { this.handle.close(); } catch (IOException e) { e.printStackTrace(); } } }
这个时候开启三个Client,可以看到Server处理了多个Client发来的数据:
数据发送的顺序是:
Client1连接Server;
Client2连接Server;
Client3连接Server;
Client1发送五个”client1”;
Client2发送五个”client2”;
Client3发送五个”client3”;
Client1发送五个”client1”,Client1结束;
Client2发送五个”client2”,Client2结束;
Client3发送五个”client3”,Client3结束;
Server结束。
过程感言
写多线程Server,我还出现了一个低级错误。
handles[i].start();
被我写成了handles[i].run();
,结果多线程就变成单线程了,我还那纳闷我的程序是不是有错误呢。for (int i = 0; i < handles.length; ++i) { handles[i] = new HandleThread(server.accept()); System.out.println("\n------a new client connect success------"); handles[i].start(); }