1、首先编写socket服务端程序,废话不说,下面直接上代码
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
private void initServer() throws IOException{
// 监听指定的端口
int port = 8888;
ServerSocket server = new ServerSocket(port);
// server将一直等待连接的到来
System.out.println("server将一直等待连接的到来");
int i=1;
while(true){
Socket socket = server.accept();
System.out.println("客户端-"+ i +" 连接上了");
/*reader = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
getClientMessage(socket1);*/
InputStream in = socket.getInputStream();
byte[] buffer = new byte[1024];
while(true){
System.out.println("服务端将要读取客户端发来的信息。。。。");
int len = in.read(buffer);
System.out.println("服务端正在读取客户端发来的信息。。。。");
if(len != -1){
String info = new String(buffer, 0, len);
System.out.println("客户端消息:" + info);
}else{
//当本次客户端连接断开后才会执行break
System.out.println("跳出本次while循环:" + i);
break;
}
}
i++;
}
}
public static void main(String[] args) throws Exception {
SocketServer server = new SocketServer();
server.initServer();
}
}
2、启动服务端main方法,结果如下:
Socket socket = server.accept();
accept方法是一个阻塞方法,当没有接收到客户端的请求连接时,程序会一直阻塞在这里
3、使用cmd命令行模拟客户端进行测试
1)打开第一个cmd窗口,并 telnet localhost 8888
程序运行到 int len = in.read(buffer); 发生阻塞,说明 read 方法是阻塞方法
2) 在cmd命令行窗口,输入 Ctrl + ]
3) 命令行输入 send wyn ,然后换行
4) 打开第二个 命令行窗口 同样输入 telnet localhost 8888 ,效果如下
会发现 控制台 的打印结果 没有发生变化。为什么会出现这种情况呢?就是因为
Socket socket = server.accept(); 这段代码是阻塞的,由于第一次的cmd占用着 socket服务端的连接,所造成的。
如果关闭掉 第一次的cmd窗口,那么第二次的cmd窗口所发送的连接请求就会被socket服务端接收到,如下图:
但是一般应用中客户端的请求数是很多的,这种请求串行的情况是不符合系统要求的,所以一般会使用多线程
来解决这种问题。