一:引言:
显示结果在控制台显示,未能实现图形界面的结合
二:上码
1.服务端
package com.wyj.talkhome;
/**
* 实现一个用户可以接发多条消息
*
*
*/
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;public class Demo4_服务端群聊版 {//在遍历一个list的时候,还向list中添加元素private static CopyOnWriteArrayList<pipe> all =new CopyOnWriteArrayList<pipe>();public static void main(String[] args) throws IOException {System.out.println("---server---");//1.使用ServerSocket创建一个服务端 并指定一个端口号ServerSocket server = new ServerSocket(7777); //阻塞式等待链接boolean aa = true;while( aa ) {Socket client = server.accept();System.out.println("一个客户端链接成功");pipe p = new pipe(client);all.add(p);new Thread(p).start();}}static class pipe implements Runnable{private Socket client;private DataInputStream dis;private DataOutputStream dos;private boolean runing = true;private String name;public pipe( Socket client ) {this.client = client;try {dis = new DataInputStream(client.getInputStream());dos = new DataOutputStream(client.getOutputStream());this.name = receive();this.send("欢迎你的到来");sendothers(this.name+"来到了聊天室",true);//系统消息} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();release();}}//收到private String receive() {String msg = "";try {if (msg != null )msg = dis.readUTF();} catch (IOException e) {// TODO Auto-generated catch block// e.printStackTrace();release();}return msg;}//发送private void send ( String msg ) {try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {// TODO Auto-generated catch block//e.printStackTrace();this.runing = false;release();}}//发送信息给其他人private void sendothers(String msg,boolean isSys) {for( pipe others:all) {if( others == this) {continue;}if(!isSys)//群消息others.send(this.name+"对所有人说:"+msg);else//系统消息others.send(msg);}}//释放资源private void release() {try {if( dos != null )dos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if( dis != null )dis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if( client != null )client.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run() {// TODO Auto-generated method stub//Io流 //输入流 接受客户端的请求while( runing ) {//收到请求String msg = receive();//反馈结果if( !msg.equals(""))sendothers(msg,false);elseruning = false;}//释放资源release();}}
}
2.客户端
package com.wyj.talkhome;
/*** 实现多用户可以接发多条消息* */import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;public class Demo4_客户端群聊版 {public static void main(String[] args) throws UnknownHostException, IOException {// TODO Auto-generated method stubSystem.out.println("---client---");BufferedReader brr = new BufferedReader( new InputStreamReader(System.in));System.out.print("请输入你在群聊中的名称:");String name = brr.readLine();//使用Socket创建客户端并指定IP和端口号Socket client = new Socket("localhost",7777);new Thread(new Demo4_客户端send(client,name)).start();new Thread(new Demo4_客户端receive(client)).start();}}
3:客户端中实现的发送信息给服务端
package com.wyj.talkhome;import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;public class Demo4_客户端send implements Runnable{private Socket client;private DataOutputStream dos; private DataInputStream dis;private BufferedReader br;private boolean runing = true;private String name;public Demo4_客户端send( Socket client ,String name) {this.client = client;this.name = name;br = new BufferedReader(new InputStreamReader(System.in));try {dos = new DataOutputStream(client.getOutputStream());send(this.name);//建立好通道 直接发送名字} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();this.release();}}//释放资源private void release() {try {if( dos != null )dos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if( dis != null )dis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if( client != null )client.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//从控制台获取信息private String fromconsole() {try {return br.readLine();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();this.release();}return "";} //向服务端发送信息private void send( String msg) {try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {// TODO Auto-generated catch block//e.printStackTrace();this.runing = false;this.release();}}public void run() {// TODO Auto-generated method stubwhile(runing) {String msg = fromconsole();if( !msg.equals("")) {send(msg);}} }}
4:客户端接受服务端反馈的消息
package com.wyj.talkhome;import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;public class Demo4_客户端receive implements Runnable{private DataInputStream dis; private Socket client;boolean runing = true;public Demo4_客户端receive(Socket client) {try {dis = new DataInputStream(client.getInputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();this.release();}}private String receive() {String msg = "";try {if (msg != null )msg = dis.readUTF();} catch (IOException e) {// TODO Auto-generated catch block// e.printStackTrace();release();}return msg;}//释放资源private void release() {try {if( dis != null )dis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if( client != null )client.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run() {// TODO Auto-generated method stubwhile( runing ) {//收到反馈结果String msg1 = receive();if( !msg1.equals(""));System.out.println(msg1);}}}