TCP编程
TCP协议:有链接、保证可靠的无误差通讯
- 服务器:创建一个ServerSocket,等待连接
- 客户机:创建一个Socket,连接到服务器
- 服务器:ServerSocket接收到连接,创建一个Socket和客户的Socket建立专线连接,后续服务器和客户机的对话(这一对Socket)会在一个单独的线程(服务器端)上运行
- 服务器的ServerSocket继续等待连接,返回 1
ServerSocket:服务器码头
- 需要绑定port
- 不指定IP地址,默认本机。如果有多块网卡,需要绑定一个IP地址
Socket:运输通道
- 客户端需要绑定服务器的地址和Port
- 客户端往Socket输入流写入数据,送到服务端
- 客户端从Socket输出流取服务器端过来的数据
- 服务端反之亦然
TCP
- 服务端等待响应时,处于阻塞状态
- 服务端可以同时响应多个客户端
- 服务端每接受一个客户端,就启动一个独立的线程与之对应
- 客户端或者服务端都可以选择关闭这对Socket的通道
单线程服务程序
server源代码:
package com.lihuan.network.demo02;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) {
try {
//创建ServerSocket驻守8001端口
ServerSocket ss = new ServerSocket(8001);
//等待阻塞
Socket s = ss.accept();
System.out.println("welcome to java world");
//定义通道输入流、输出流
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
//同一个通道,服务端的输出流就是客户端的输入流,服务端的输入流就是客户端的输出流
ops.write("Hello, Client!".getBytes()); //输出一句话给客户端
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
//从客户端读取一句话
System.out.println("Client said: " + br.readLine());
ips.close();
ops.close();
s.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
client源代码:
package com.lihuan.network.demo02;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) {
try {
//创建Socket连接服务器
Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8001);
//定义通道输入流、输出流
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("Server said: " + brNet.readLine());
}
}
dos.close();
brNet.close();
ops.close();
ips.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
多线程服务程序
server源代码:
package com.lihuan.network.demo02;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer2 {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8001);
while (true){
Socket s = ss.accept();
System.out.println("来了一个client");
new Thread(new Worker(s)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
worker源代码(实现Runnable接口)
package com.lihuan.network.demo02;
import java.io.*;
import java.net.Socket;
public class Worker implements Runnable {
Socket s;
public Worker(Socket s) {
this.s = s;
}
@Override
public void run() {
try {
System.out.println("服务人员已启动");
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos = new DataOutputStream(ops);
while (true){
String strWord = br.readLine();
System.out.println("client said: " + strWord + ":" + strWord.length());
if(strWord.equalsIgnoreCase("quit")){
break;
}
String strEcho = strWord + "666";
System.out.println("server said: " + strWord + "---->" + strEcho);
dos.writeBytes(strWord + "---->" + strEcho + System.getProperty("line.separator"));
}
br.close();
dos.close();
ips.close();
ops.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
client源代码:
package com.lihuan.network.demo02;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) {
try {
//创建Socket连接服务器
Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8001);
//定义通道输入流、输出流
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("Server said: " + brNet.readLine());
}
}
dos.close();
brNet.close();
ops.close();
ips.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}