import java.io.*;//这里使用BufferedReader,DataInputStream,DataOutputStream,IOException,InputStreamReader类
import java.net.*;//这里使用ServerSocket和Socket类
public class TestSocketServer_bidi
{
public static final int PORT = 8000;//监听的端口号
public static void main(String[] args)
{
TestSocketServer_bidi server = new TestSocketServer_bidi();
server.init();
}
public void init()//初始化
{
ServerSocket serverSocket = null;//定义一个ServerSocket
try
{
serverSocket = new ServerSocket(PORT);//新建一个ServerSocket对象
while (true)
{
Socket client = serverSocket.accept();//等待客户端连接,连接后返回一个Socket对象
//一个客户端连接就开户两个线程处理读写
//新开一个读线程,调用start方法,该线程开始执行
new Thread(new ReadHandlerThread(client)).start();
//新开一个写线程 ,调用start方法,该线程开始执行
new Thread(new WriteHandlerThread(client)).start();
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(serverSocket != null)
{
serverSocket.close();
}
}
catch (Exception e)//原来是IOException
{
e.printStackTrace();
}
}
}
}
/*
*处理读操作的线程
*/
class ReadHandlerThread implements Runnable//实现Runnable接口
{
private Socket client;
public ReadHandlerThread(Socket client)//构造方法
{
this.client = client;//将形参client赋给属性client
}
@Override
//实现run方法
public void run()
{
//定义一个DataInputStream对象,用来接受输入数据流
DataInputStream dis = null;
try
{
while(true)
{
//读取客户端数据
//获取client端的输入流通道地址
dis = new DataInputStream(client.getInputStream());
//从包含的输入流中读取此操作需要的字节
String receive = dis.readUTF();
System.out.println("客户端发过来的内容:" + receive); //输出内容
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(dis != null)//当输入流不为空时,
{
dis.close();//关闭输入流
}
if(client != null)//当客户端不为空时,
{
client = null;//关闭客户端
}
}
catch (Exception e)//原来是IOException
{
e.printStackTrace();
}
}
}
}
/*
* 处理写操作的线程
*/
class WriteHandlerThread implements Runnable
{
private Socket client;//
public WriteHandlerThread(Socket client)//构造方法
{
this.client = client;//将形参client赋给属性client
}
@Override
public void run()
{
DataOutputStream dos = null;//定义一个DataOutputStream对象,用来接受输出数据流
BufferedReader br = null;//定义一个BufferedReader对象,用来缓冲读取数据
try
{
while(true)
{
//向客户端回复信息
dos = new DataOutputStream(client.getOutputStream());//获取client端的输出流通道地址
System.out.print("请输入:\t");//
// 键盘录入
br = new BufferedReader(new InputStreamReader(System.in));//缓冲键盘读取的数据
String send = br.readLine();//读取一行数据
//发送数据
dos.writeUTF(send);//以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(dos != null)
{
dos.close();//
}
if(br != null)
{
br.close();//
}
if(client != null)
{
client = null;//
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
4.Socket双向通信--服务器端
最新推荐文章于 2022-06-14 21:41:54 发布