学习Java(87)_基于TCP的聊天程序(一)

使用基于TCP的socket编程的知识编写实现一个聊天程序,你一句我一句的交流。
客户端程序
import java.io.*;
import java.net.*;
class TClient_1
{
	public static void main( String[] args )
	{
		Socket s = null;
		//定义Socket对象的引用,赋值为null,以防空指针异常(下同);
		DataInputStream dis = null;
		DataOutputStream dos = null;
		BufferedReader br = null;
		
		try
		{
			s = new Socket( "127.0.0.1", 6789 ); //与服务端发出连接请求
			
			//建立输入流,获取服务端发来的信息
			dis = new DataInputStream( s.getInputStream() );
			
			//建立输出流,获取客户端要发出的信息
			dos = new DataOutputStream( s.getOutputStream() );
			
			//从键盘上获取输入的信息
			br = new BufferedReader( new InputStreamReader( System.in ) );
			
			while( true )
			{
				String str = br.readLine(); //获取键盘上输入的字符串
				dos.writeUTF( str );	//将输入的字符串通过输出流发送到服务端
				if( str.equalsIgnoreCase( "再见" ) )	//如果自己发送了“再见”,则结束对话
				{
					break;
				}
				//获取服务端发来的信息
				str = dis.readUTF(); //readUTF()为阻塞式方法,没有消息进来,程序就会停滞不前
				System.out.println( "对方说:"+ str );
				if( str.equalsIgnoreCase( "再见" ) )	//如果对方发送了“再见”,则结束对话
				{
					break;
				}
			}
		}
		catch( SocketException e )
		{
			System.out.println( "网络连接失败,程序终止!" );	
		}
		catch( IOException e )
		{
			System.out.println( "读写数据错误,程序终止!" );	
		}
		catch( Exception e )
		{
			e.printStackTrace();
		}
		
		finally
		{
			try
			{
				s.close();
				dis.close();
				dos.close();
				br.close();
			}
			catch( Exception e )
			{
				e.printStackTrace();
			}
		}
	}
	
}
/*
	在JDK1.8.0_91中运行的结果是:
	============================
	E:\textjava\chat\two>java TClient_1
	你好!
	对方说:你好,很高兴认识你。
	我也是。你叫什么名字?
	对方说:我叫小艾
	再见
	============================
	总结:
		
*/
服务端程序
import java.io.*;
import java.net.*;
class TServer_1
{
	public static void main( String[] args )
	{
		ServerSocket ss = null; //创建一个服务器套接字
		Socket s = null;
		DataInputStream dis = null;
		DataOutputStream dos = null;
		BufferedReader br = null;
		
		try
		{
			//创建一个服务器套接字
			ss = new ServerSocket( 6789 );
			
			s = ss.accept(); //监听6879端口
			
			//建立输入流,获取服务端发来的信息
			dis = new DataInputStream( s.getInputStream() );
			
			//建立输出流,获取客户端要发出的信息
			dos = new DataOutputStream( s.getOutputStream() );
			
			//从键盘上获取输入的信息
			br = new BufferedReader( new InputStreamReader( System.in ) );
			
			//不间断的聊天中
			while( true )
			{
				String str = dis.readUTF(); //从输入流中读出客户端发送过来的消息
				System.out.println( "对方说:"+ str );
				if( str.equalsIgnoreCase( "再见" ) )	//如果对方发送了“再见”,则结束对话
				{
					break;
				}
				
				str = br.readLine(); //接收键盘输入的字符串
				dos.writeUTF( str ); //通过输出流将字符串发送到客户端
				if( str.equalsIgnoreCase( "再见" ) )	//如果自己发送了“再见”,则结束对话
				{
					break;
				}
					
			}
			
		}
		catch( SocketException e )
		{
			System.out.println( "网络连接失败,程序终止!" );	
		}
		catch( IOException e )
		{
			System.out.println( "读写数据错误,程序终止!" );	
		}
		catch( Exception e )
		{
			e.printStackTrace();
		}
		
		finally
		{
			try
			{
				ss.close();
				s.close();
				dis.close();
				dos.close();
				br.close();
			}
			catch( Exception e )
			{
				e.printStackTrace();
			}
		}
	}
}
/*
	在JDK1.8.0_91中运行的结果是:
	============================
	E:\textjava\chat\two>java TServer_1
	对方说:你好!
	你好,很高兴认识你。
	对方说:我也是。你叫什么名字?
	我叫小艾
	对方说:再见
	============================
	总结:
		
*/
这两端程序能够实现两台主机的交流,但是缺点也是很明显的,比如:只能是客户端先说话,服务端才能说话;每次说话都必须是一人一句的说,不能连续说两句等问题,原因就是使用的是单线程,可以使用多线程来弥补这个问题。


小艾的博客 http://www.aixinyan.me/