聊天室的客户端Client

package chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * 聊天室的客户端
 * @author adminitartor
 *
 */
public class Client {
	/*
	 * 套接字
	 * 底层封装这TCP协议,使用其进行网络通讯
	 */
	private Socket socket;
	/**
	 * 构造方法,用来初始化客户端
	 * @throws Exception 
	 */
	public Client() throws Exception{
		try {
			/*
			 * 实例化Socket时需要传入两个参数
			 * 参数1:服务端的ip地址
			 * 参数2:服务端的端口号
			 * 通过IP可以连接到服务端计算机,通过
			 * 端口连接到运行在服务端计算机上的
			 * 服务端应用程序。
			 * 创建Socket的过程就是连接的过程,所以
			 * 若服务端没有响应,这里会抛出异常
			 */
			System.out.println("正在连接服务端...");
			socket = new Socket(
				"localhost",8088	
			);
			System.out.println("已连接服务端!");
		} catch (Exception e) {
			System.out.println("客户端初始化失败!");
			throw e;
		}
	}
	/**
	 * 启动客户端的方法
	 */
	public void start(){
		try {
			Scanner scanner = new Scanner(System.in);
			//先要求用户输入一个昵称
			String nickName = null;
			while(true){
				System.out.println("请输入昵称:");
				nickName = scanner.nextLine();
				if(nickName.length()>0){
					break;
				}
				System.out.println("至少输入一个字符.");
			}
			
			/*
			 * 若想向服务端发送信息,需要通过socket
			 * 获取输出流,通过该流写出的数据就会通过
			 * 网络发送至服务端了。
			 */
			OutputStream out
				= socket.getOutputStream();
			
			OutputStreamWriter osw
				= new OutputStreamWriter(out,"UTF-8");
			
			PrintWriter pw
				= new PrintWriter(osw,true);
			//首先将昵称发送给服务端
			pw.println(nickName);			
			System.out.println("欢迎你:"+nickName+"!开始聊天吧!");
			
			
			
			//首先启动接受服务端消息的线程
			ServerHandler handler = new ServerHandler();
			Thread t = new Thread(handler);
			t.start();	
			
			
			
			
			
			
			while(true){
				String message = scanner.nextLine();
				pw.println(message);
			}
			
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		try {
			Client client = new Client();
			client.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 该线程用来接收并处理服务端发送过来的消息
	 * @author adminitartor
	 *
	 */
	private class ServerHandler 
						implements Runnable{
		
		public void run(){
			try {
				
				BufferedReader br = new BufferedReader(
					new InputStreamReader(
						socket.getInputStream(),"UTF-8"	
					)	
				);
				
				String message = null;
				while((message = br.readLine())!=null){
					System.out.println(message);
				}
				
				
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
		
	}
}






猜你喜欢

转载自luckybrown.iteye.com/blog/2330876
今日推荐