Socket协议的形象描述 通常短连接是这样:连接->传输数据->关闭连接 那什么时候用短连接呢? TCP/IP通信解读长短链接 一。通信方式 (二)连接方式 2.短连接 (三)发送接收方式 实际通信方式是这三类通信方式的组合。比如一般书上提供的 同步短连接Server/Client 其中异步长连接双工是最为复杂的一种通信方式,有时候经 二.报文格式 (一)阻塞与非阻塞方式 (二)循环读写方式 3.带长度报文头循环读写 ------------------------------------------------------------------------------------------------ 基于TCP/IP的通讯有两个步骤:1、连接;2、通讯。client连接到server的监听端口,随后在server端会随机产生一个通讯端口和client进行数据通讯。端口是个unsigned short类型的数据结构。所以最多连接是65535。系统一般要求1024前的端口是系统使用的。建议用户程序的监听端口大于10000,通讯端口是系统随机分配的。假如需要有10万个客户端,程序应该怎么处理呢? 如果只有一个服务器,只能用短连接的方式处理。如果都是长连接就要负载均衡。把连接分到其它服务器上去处理。 |
Socket案例如下
客户端代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ClintSocketTest {
public void clintStart(){
try{
//Socket socket = new Socket("130.251.9.34", 8787);
//Socket中的2个参数分别是服务器地址和开放的端口号
Socket socket = new Socket("localhost", 8787);
System.out.println("Established a connection...");
// 由系统标准输入设备构造BufferedReader对象
BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
// 由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter out = new PrintWriter(socket.getOutputStream());
// 由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
String line; // 保存一行内容
// 从系统标准输入读入一字符串
line = sysin.readLine();
while (!line.equals("bye")) { // 若从标准输入读入的字符串为 "bye"则停止循环
// 将从系统标准输入读入的字符串输出到Server
out.println(line);
// 刷新输出流,使Server马上收到该字符串
out.flush();
// 在系统标准输出上打印读入的字符串
System.out.println("[Client]: " + line);
// 从Server读入一字符串,并打印到标准输出上
System.out.println("[Server]: " + in.readLine());
// 从系统标准输入读入一字符串
line = sysin.readLine();
}
out.close(); // 关闭Socket输出流
in.close(); // 关闭Socket输入流
socket.close(); // 关闭Socket
} catch (Exception e) {
System.out.println("Error. " + e);
}
}
public static void main(String[] args)
{
ClintSocketTest a = new ClintSocketTest();
a .clintStart();
}
}
服务端代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketTest {
public void serverStart() {
try {
ServerSocket sc = new ServerSocket(8787);
Socket ss = sc.accept();
while(true){
//由socket对象得到输入流,构造BufferedReader对象
BufferedReader is=new BufferedReader(new InputStreamReader(ss.getInputStream()));
//由socket对象得到输出流,构造PrintWriter对象
PrintWriter os=new PrintWriter(ss.getOutputStream());
//由系统标准输入设备,构造BufferedReader对象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//从标准输入上打印客户端读入的字符串
System.out.println("Client:"+is.readLine());
//从标准输入读入一个字符串
String line=null;
line=sin.readLine();
//如果读取字符串为bye 则停止循环
while(!line.equals("bye")){
//向客户端输出该字符
os.println(line);
os.flush();
}
is.close();
os.close();
ss.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
ServerSocketTest serSocket = new ServerSocketTest();
serSocket.serverStart();
}
}