一、概念
TCP:Transmission Control Protocol,传输控制协议,面向连接的协议,两台机器的可靠无差错的数据传输,双向字节流传递
- TCP协议:有链接、保证可靠的无误通讯
- 服务器:创建一个ServerSocket,等待连接
- 客户机:创建一个Socket,连接到服务器
- 服务器:ServerSocket接收到连接,创建一个Socket和客户的Socket建立专线连接,后续服务器和客户机的对话(一对Socket)会在一个单独线程运行
- 服务器:创建一个ServerSocket,等待连接
- ServerSocket:服务器码头,需要绑定Port,如果有多块网卡,需要绑定一个IP地址
- Socket:运输通道,客户端需要绑定服务器的地址和Port,客户端往Socket输入流写入数据,送到服务端,客户端从Socket输出流取服务端的应答,服务端反之亦然
- 服务端等待响应时,处于阻塞状态
- 服务端可以同时响应多个客户端
- 服务端每接受一个客户端,就启动一个独立线程
- 客户端或者服务端都可以选择关闭这对Socket
二、实例
服务端
package tcp;
import java.io.;
import java.net.;
public class TcpTestServer {
public static void main(String[] args) {
try{
ServerSocket ss = new ServerSocket(8080);
Socket s = ss.accept();
System.out.println(“welcome TCP connection”);
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
ops.write(“hello,client”.getBytes());
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
System.out.println(“recive Client:”+br.readLine());
ips.close();
ops.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
package tcp;
import jdk.management.resource.internal.inst.SocketInputStreamRMHooks;
import java.io.;
import java.net.;
public class TcpTestClient {
public static void main(String[] args) {
try{
Socket s = new Socket(InetAddress.getByName(“127.0.0.1”),8080);
InputStream ips = s.getInputStream();
BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));
OutputStream ops = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(ops);
BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
while (true)
{
String strWord = brKey.readLine();
if (strWord.equalsIgnoreCase(“quit”))
{
break;
}else{
System.out.println(“I want to send :”+strWord);
dos.writeBytes(strWord+System.getProperty(“line.separator”));
System.out.println(“Recive Server :”+brNet.readLine());
}
}
dos.close();
brNet.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}