![](https://i-blog.csdnimg.cn/blog_migrate/9dd00d19cd60544faecf39e6b17d8069.png)
1、简单的例子,server端只负责接收数据,client端只负责发送数据。
package com.test.tcpsimple;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TCPSimpleServerTest {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
System.out.println("服务端启动成功,建立监听客户端消息。。。");
ServerSocket server = null;
try {
// 创建一个ServerSocket在端口8888监听客户请求
server = new ServerSocket(8888);
} catch (Exception e) {
e.printStackTrace();
}
try {
Socket socket = null;
while (true) {
try {
// 由Socket对象得到输入流,并构造相应的BufferedReader对象
// 使用accept()阻塞等待客户请求,有客户
// 请求到来则产生一个Socket对象,并继续执行
socket = server.accept();
} catch (Exception e) {
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println( sdf.format(new Date()) + " 接收到客户端消息:" + br.readLine());
socket.close(); // 关闭Socket
br.close(); // 关闭Socket输入流
}
} catch (Exception e) {
e.printStackTrace();
} finally {
server.close(); // 关闭ServerSocket
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.test.tcpsimple;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TCPSimpleClientTest {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
System.out.println("客户端启动成功!");
System.out.print("请输入需要发送给服务端的消息:");
// 由系统标准输入设备构造BufferedReader对象
BufferedReader brIn = new BufferedReader(new InputStreamReader(System.in));
// 从系统标准输入读入一字符串
String readline = brIn.readLine();
// 若从标准输入读入的字符串为 "bye"则停止循环
while (!readline.equals("bye")) {
// 向本机的8888端口发出客户请求
Socket socket = new Socket("127.0.0.1", 8888);
PrintWriter pw = new PrintWriter(socket.getOutputStream());
// 将从系统标准输入读入的字符串输出到Server
pw.println(readline);
// 刷新输出流,使Server马上收到该字符串
pw.flush();
// 在系统标准输出上打印读入的字符串
System.out.println(sdf.format(new Date()) + " 向服务端发送消息:" + readline);
System.out.println();
System.out.print("请输入需要发送给服务端的消息:");
pw.close();
// 关闭Socket输出流
socket.close();
// 从系统标准输入读入一字符串
readline = brIn.readLine();
} // 继续循环
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、扩展的例子,server端监听数据,监听到后,可以给clinet端进行回复,client端发送数据,但是也可以接收都server端的回复
package com.test.tcp;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TCPServerTest {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
System.out.println("服务端启动成功,建立监听客户端消息。。。");
ServerSocket server = null;
try {
// 创建一个ServerSocket在端口8888监听客户请求
server = new ServerSocket(8888);
} catch (Exception e) {
e.printStackTrace();
}
try {
Socket socket = null;
while (true) {
try {
// 由Socket对象得到输入流,并构造相应的BufferedReader对象
// 使用accept()阻塞等待客户请求,有客户
// 请求到来则产生一个Socket对象,并继续执行
socket = server.accept();
} catch (Exception e) {
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println( sdf.format(new Date()) + " 接收到客户端消息:" + br.readLine());
System.out.print("请输入返回给客户端的响应信息:");
String line;
// 由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter pw = new PrintWriter(socket.getOutputStream());
// 由系统标准输入设备构造BufferedReader对象
BufferedReader brIn = new BufferedReader(new InputStreamReader(System.in));
// 在标准输出上打印从客户端读入的字符串
// 从标准输入读入一字符串
line = brIn.readLine();
// 如果该字符串为 "bye",则停止循环
if(line.equals("bye"));
// 向客户端输出该字符串
pw.println(line);
// 刷新输出流,使Client马上收到该字符串
pw.flush();
// 在系统标准输出上打印读入的字符串
System.out.println( sdf.format(new Date()) + " 向客户端发送响应:" + line);
System.out.println("");
socket.close(); // 关闭Socket
pw.close(); // 关闭Socket输出流
br.close(); // 关闭Socket输入流
}
} catch (Exception e) {
e.printStackTrace();
} finally {
server.close(); // 关闭ServerSocket
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.test.tcp;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TCPClientTest {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
// 向本机的8888端口发出客户请求
System.out.println("客户端启动成功!");
System.out.print("请输入需要发送给服务端的消息:");
// 由系统标准输入设备构造BufferedReader对象
BufferedReader brIn = new BufferedReader(new InputStreamReader(System.in));
// 从系统标准输入读入一字符串
String readline = brIn.readLine();
// 若从标准输入读入的字符串为 "bye"则停止循环
while (!readline.equals("bye")) {
Socket socket = new Socket("127.0.0.1", 8888);
PrintWriter pw = new PrintWriter(socket.getOutputStream());
// 将从系统标准输入读入的字符串输出到Server
pw.println(readline);
// 刷新输出流,使Server马上收到该字符串
pw.flush();
// 在系统标准输出上打印读入的字符串
System.out.println(sdf.format(new Date()) + " 向服务端发送消息:" + readline);
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(sdf.format(new Date()) + " 接收到服务端反馈消息:" + is.readLine());
System.out.println();
System.out.print("请输入需要发送给服务端的消息:");
is.close();
pw.close();
// 关闭Socket输出流
socket.close();
// 从系统标准输入读入一字符串
readline = brIn.readLine();
} // 继续循环
} catch (Exception e) {
e.printStackTrace();
}
}
}