/**
*以下是TCP编程中多线程服务端
*/
import java.net.ServerSocket;
import java.net.Socket;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Date;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class TCPServerA
{
public static void main(String[] args) throws Exception{
//创建套接字
ServerSocket ss=new ServerSocket(9999);
//接收客户端请求
Socket s=null;
while((s=ss.accept())!=null){
//返回套接字之后调用IO线程
new Test(s).start();
}
ss.close();
}
}
class Test extends Thread
{
private Socket s;
public Test(Socket socket){
super();
this.s=socket;
}
public void run(){
try{
//向客户端打印服务端本地时间
OutputStream os=s.getOutputStream();
PrintWriter pw=new PrintWriter(os,true);
pw.println("now time:"+new Date());
//测试接收客户端数据,加10秒暂停,再输出客户端发来的数据,便于观察
InputStream is=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
try{
Thread.sleep(10000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(br.readLine());
pw.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
/**
*以下是TCP编程中单线程服务端
*/
import java.net.ServerSocket;
import java.net.Socket;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Date;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class TCPServer
{
public static void main(String[] args) throws Exception{
//创建套接字
ServerSocket ss=new ServerSocket(9999);
//接收客户端请求
Socket s=null;
while((s=ss.accept())!=null){
OutputStream os=s.getOutputStream();
PrintWriter pw=new PrintWriter(os,true);
pw.println("now time:"+new Date());
//测试接收客户端数据,加10秒暂停,再输出客户端发来的数据,便于观察
InputStream is=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
try{
Thread.sleep(10000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(br.readLine());
pw.close();
s.close();
}
ss.close();
}
}
/**
*以下是TCP编程中客户端代码
*/
import java.io.*;
import java.net.*;
public class TCPClientA
{
public static void main(String[] args) throws Exception{
//创建套接字,指明目的服务端和服务端端口号
Socket s=new Socket(InetAddress.getByName("127.0.0.1"),9999);
//打印从服务端接收来的数据
InputStream is=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String str=br.readLine();
System.out.println(str);
//向服务端发送数据
OutputStream os=s.getOutputStream();
PrintWriter pw=new PrintWriter(os,true);
pw.println("我是客户端");
br.close();
s.close();
}
}
演示过程:
运行多线程服务端加客户端版本:
dos窗口java TCPServerA,开启ServerA等待接收套接字响应,然后新建两个dos窗口,都运行
java TCPClientA,观察两者打印服务端时间是同步的,等待10秒是同步的,最后服务端打印“我是客户端”也是同步的
运行单线程服务端加客户端版本:
同样开三个dos窗口,先开启服务端,运行后发现,第二个请求连接的客户端必须等到第一个打印完时间、等待10秒、
服务端打印这三步才会开始打印时间···等,也就是必须等到第一个客户端请求完全结束,关闭之后才可以与服务端连接。