如下所示:
package socket;
/**
* 聊天室客户端
* @author Administrator
*
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
/*
* Socket 套接字 封装了TCP协议连接和通讯的细节,使用它与远程计算机建立连接后可以通过两条流来实现相互的数据交换
*/
private Socket socket;
/**
* 构造方法,用来初始化客户端
*/
public Client() {
try {
/*
* 实例化Socket 实例化时需要传入两个参数: 1.服务端计算机地址信息(IP)----localhost表示本机IP地址---176.30.2.234
* 2.服务端程序申请的服务端口 通过IP地址我们可以找到网络上的服务端计算机,通过端口可以连接到该机器上的服务端应用程序
* 实例化的过程就是与服务端建立连接的过程,若指定的服务端IP地址与端口无效时,这里实例化会出现异常
*/
System.out.println("正在连接服务端...");
socket = new Socket("localhost", 8098);// 此处输入服务端的IP和端口号
System.out.println("与服务端建立连接!");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 让客户端开始工作的方法
*/
public void start() {
try {
/**启动用于读取服务端发来的消息的线程*/
ServerHandler handler=new ServerHandler();
Thread t=new Thread(handler);
t.start();
/** 创建输出流 */
OutputStream out = socket.getOutputStream();
/** 往服务端发送字符串 */
OutputStreamWriter osw = new OutputStreamWriter(out, "utf-8");
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw, true);
// /**读取服务端发来的消息*/
// InputStream in=socket.getInputStream();
// InputStreamReader isr=new InputStreamReader(in,"utf-8");
// BufferedReader br=new BufferedReader(isr);
/** 用户开始在客户端输入字符串 */
Scanner scan = new Scanner(System.in);
System.out.println("开始聊天吧!");
String line = "";
while (true) {
line = scan.nextLine();
if ("退出".equals(line)) {
break;
}
pw.println(line);
// //读取服务端写入的字符串
// line=br.readLine();
// System.out.println(line);
}
scan.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client = new Client();
client.start();
}
/*
* 该线程任务负责循环读取服务端发送过来的消息并输出到控制台
*/
private class ServerHandler implements Runnable{
@Override
public void run() {
try {
/**读取服务端发来的消息*/
InputStream in=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(in,"utf-8");
BufferedReader br=new BufferedReader(isr);
/**输出到控制台*/
String line=null;
while((line = br.readLine())!=null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}