当前位置:首页 > 用java实现聊天室基础互动
如何用java语言实现聊天室基础互动
代码如下:
运行程序时应先打开服务端,再打开客户端进行连接(可打开多个客户端)
服务端代码:
package chat;
import java.io.BufferedReader; 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.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; /**
* java.net.Server
* 运行在服务端Socket
* ServerSocket有俩个主要作用:
* 1:向操作系统申请端口,客户端就是通过
* 这个端口与服务器端应运程序建立连接的, * 2:监听服务端:一旦客户端Scket通过端口连接 * 这里就会感知并自动创建一个Socket与客户端连接 * @author hw * */
public class Server {
private ServerSocket server; /*
* 存放所有客户端的输出流 */
private List
*/ server = new ServerSocket(8089); allout = new ArrayList
public void start(){ try { /* * ServerSocket提供了方法 * Socket accept()
* 该方法是一个阻塞方法,调用后会一直 * 监听端口,直到一个客户端通过该端口 * 建立连接,这时accept会返回一个Socket * 通过这个Socket就可以与客户端通讯了 */
while(true){//循环接收不同客户端的连接 System.out.println(\等待一个客户端连接...\Socket socket = server.accept();
System.out.println(\与一个客户端建立了连接\ /*
* 启动线程,来完成与该客户端的交互 */ ClientHandler handler = new ClientHandler(socket); Thread t = new Thread(handler); t.start(); } } catch (Exception e) { e.printStackTrace(); } }
public static void main(String[] args) { try { Server server = new Server(); server.start(); } catch (Exception e) { e.printStackTrace();
} } /*
System.out.println(\服务端启动失败\
* 该线程负责与指定客户端进行交互工作 */
private class ClientHandler implements Runnable{ /**
* 该线程就是通过这个Socket与指定的客户端交互的 */
private Socket socket;
//客户端的地址信息 private String host;
public ClientHandler(Socket socket){ this.socket = socket; /* * 通过Socket获取远端计算机地址信息 * 对于服务端这边而言,远端指的是客户端 * */ InetAddress address = socket.getInetAddress(); //获取ip地址的字符串形式 host = address.getHostAddress(); } /*
* 广播消息给所有客户端 *
* @see java.lang.Runnable#run() */
private void sendMessage(String message){ synchronized (allout) { for(PrintWriter o:allout){ o.println(message); } } }
public void run(){ PrintWriter pw = null; try { /* * Socket提供的方法:
// // // // //
* InputStream getInputStream()
* 通过该方法获取的输入流可以读取到 * 来自远端发送过来的数据 */
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,\ BufferedReader br = new BufferedReader(isr); //String scan = null; /*
* 通过Socket创建输出流,用于将消息发送给客户端 */
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,\ pw = new PrintWriter(osw,true); /*
* 将输出流存入到共享集合中 */
synchronized (allout) { allout.add(pw); } //广播消息,该客户端上线了 sendMessage(host+\上线了\ String scan = null; /*
* 使用br.readLine()读取客户端发送过来的一行字符串时, * 由于客户端所在系统不同,那么当客户端断开连接 * 时,这里执行的结果也不同。 * 当windows的客户端断开连接时: * br.readLine方法会抛出异常; * 当Linux的客户端断开连接时: * br.readLine()方法会返回NULL; */ while((scan = br.readLine())!=null){
System.out.println(host+\客户端说:\ // pw.println(\客户端说;\ /* * 遍历allout集合,将消息发送给所有客户端 */ synchronized (allout) { for(PrintWriter o:allout){ o.println(host+\客户端说:\ sendMessage(host+\说:\ } }
共分享92篇相关文档