用java实现聊天室基础互动 联系客服

发布时间 : 星期五 文章用java实现聊天室基础互动更新完毕开始阅读e07ae379657d27284b73f242336c1eb91b373311

如何用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 Listallout; public Server(){ try { /* * 实例化ServerSocket的同时, * 向系统申请服务端口,若端口被其他 * 申请应用程序占用,会抛出异常。

*/ server = new ServerSocket(8089); allout = new ArrayList(); } catch (Exception e) { } }

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+\说:\ } }