4.Socket双向通信--客户端

import java.io.*;//这里使用BufferedReader,DataInputStream,DataOutputStream,IOException,InputStreamReader类
import java.net.*;//这里使用Socket类

public class TestSocketClient_bidi 
{

	public static final String IP = "localhost";//服务器地址 
	public static final int PORT = 8000;//服务器端口号  

	public static void main(String[] args) 
	{  
		handler(); 
	}

	private static void handler()
	{
		try 
		{
			//实例化一个Socket,并指定服务器地址和端口
			Socket client = new Socket(IP, PORT);//
			//开启两个线程,一个负责读,一个负责写
			new Thread(new ReadHandlerThread(client)).start();//新开一个读线程,调用start方法,该线程开始执行
			new Thread(new WriteHandlerThread(client)).start();//新开一个写线程 ,调用start方法,该线程开始执行
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
	}
}  

/*
 *处理读操作的线程 
 */
class ReadHandlerThread implements Runnable
{
	private Socket client;

	public ReadHandlerThread(Socket client)//构造方法 
	{
		this.client = client;//将形参client赋给属性client
	}

	@Override
	public void run()//实现run方法 
	{
		DataInputStream dis = null;
		try 
		{
			while(true)
			{
				//读取服务器端数据  
				dis = new DataInputStream(client.getInputStream());//获取client端的输入流通道地址
				String receive = dis.readUTF();//从包含的输入流中读取此操作需要的字节   
				System.out.println("服务器端返回过来的是: " + receive);//输出内容  
			}
		} 
		catch (IOException 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 (IOException e) 
		{
			e.printStackTrace();
		}  
		finally
		{
			try
			{
				if(dos != null)
				{
					dos.close();
				}
				if(br != null)
				{
					br.close();
				}
				if(client != null)
				{
					client = null;
				}
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值