`
Everyday都不同
  • 浏览: 720486 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

Socket初步编程——简单实现群聊

阅读更多

初次接触到socket网络编程,也参考了网络上众前辈的文章。尝试自己也写了一下,记录下过程吧:

 

服务端:(接收客户端消息并把它们打印出来)

 

public class SocketServer {
	private List<Socket> socketList = new ArrayList<Socket>();
	 public static void main(String[] args) {  
		 SimServer ss = new SimServer();
		 try {
			ss.service();
		} catch (IOException e) {
			e.printStackTrace();
		}
	 }  
	 
	 public void service() throws IOException {
		 ServerSocket server = new ServerSocket(7001);  
		 SimServer ss = new SimServer();
		 while (true) {  
			 Socket socket = server.accept(); 
			 socketList.add(socket);
			 ServerThread st = new ServerThread(socket, socketList);
			 st.start();
		 }  
		 
	 }
	 
	 class ServerThread extends Thread {
		private Socket client;
		private List<Socket> socketList;
		public ServerThread(Socket client, List<Socket> socketList) {
			this.client = client;
			this.socketList = socketList;
		}
		
		@Override
		public void run() {
			BufferedReader in = null;  
            PrintWriter out = null;  
            try {  
                in = new BufferedReader(new InputStreamReader(client.getInputStream()));  
                while (true) {  
                    String msg = in.readLine();  
                    System.out.println(InetAddress.getLocalHost().getHostAddress() + " 客户端请求:" +msg);
//                    System.out.print("服务端请输入:");
//                    String input = new BufferedReader(new InputStreamReader(System.in)).readLine();
                    System.out.println();
                    for(int i=0; i<socketList.size(); i++) {
//                    	out = new PrintWriter(client.getOutputStream());
                    	out = new PrintWriter(socketList.get(i).getOutputStream());
                    	out.println("服务端返回:" + msg);
                    	out.println();
                    	out.flush();  
//                    out.println("Server handle: " + Arrays.toString(msg.getBytes()));
// 					  out.write("Server handle: " + Arrays.toString(msg.getBytes()));
//                    String lineSeprator = (String) java.security.AccessController.doPrivileged(
//                    		new sun.security.action.GetPropertyAction("line.separator"));
//                    out.write(lineSeprator);
//                    if (msg.equals("bye")) {  
//                        break;  
//                    }  
                    	
                    }
                }  
            } catch(IOException ex) {  
                ex.printStackTrace();  
            } finally {  
                try {  
                    in.close();  
                } catch (Exception e) {}  
                try {  
                    out.close();  
                } catch (Exception e) {}  
                try {  
//                    client.close();  
                } catch (Exception e) {}  
            }
		}
		 
	 } 
	   
}

 

客户端:(发送消息并接收消息,这个应该是异步的,所以必须创建两个线程)

public class SocketClient {
	
	class Send extends Thread {
		private Socket socket;
		public Send(Socket socket) {
			this.socket = socket;
		}
		@Override
		public void run() {
			PrintWriter out = null;
			BufferedReader input = null;
			 try {
				out = new PrintWriter(socket.getOutputStream());
				input = new BufferedReader(new InputStreamReader(System.in));
				 while (true) {
			        	System.out.print(InetAddress.getLocalHost().getHostAddress()+" 客户端请输入:");
			            String msg = input.readLine();  
			            out.println(msg);  
			            out.flush(); 
			             
			        }  
//			        socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}finally {
				try {
					if(input != null)
						 input.close(); 
					 if(out != null)
	                     out.close();
//					 if(socket != null)
//						 socket.close();
                } catch (Exception e) {}  
                
			}
		}
	}
	
	class Recv extends Thread {
		private Socket socket;
		public Recv(Socket socket) {
			this.socket = socket;
		}
		@Override
		public void run() {
			BufferedReader reader = null;
			 try {
				reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				 while (true) {
					 	System.out.println();
			            String msg = reader.readLine();  
			            System.out.println(msg);  
			           
			        }  
			} catch (IOException e) {
				e.printStackTrace();
			}finally {
				try {
					if(reader != null)
						reader.close(); 
//					 if(socket != null)
//						 socket.close();
                } catch (Exception e) {}
			}
		}
	}
	
	public static void main(String[] args) {
		SimClient sc = new SimClient();
		try {
			Socket s = new Socket("localhost", 7001);
			sc.new Recv(s).start();
			sc.new Send(s).start();
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}	
}

 

(可在另一台机器上有一个一模一样的客户端,只不过ip地址要改为服务器所在的机器的ip)

 

-----------------------------------

在此过程中,发现了几点:

1)服务端用的是ServerSocket,每当有一个客户端连接上服务端,就会触发serverSocket.accept()产生一个socket用于和客户端交互;

2)PrintWriter.write(String msg)无法把消息发出去,而PrintWriter.println(String msg)则可以,但println(String msg)相当于(要同时write lineSeprator):

 out.write("Server handle: " + Arrays.toString(msg.getBytes()));

 String lineSeprator = (String) java.security.AccessController.doPrivileged(

                  new sun.security.action.GetPropertyAction("line.separator"));

 out.write(lineSeprator);

3)服务端线程必须把socketList传进来,它才能知道有几个客户端连着它。

分享到:
评论

相关推荐

    基于socket聊天程序编写实验报告

    为实现网络聊天的功能,采用Windows Socket编程,服务器与客户端采用了TCP/IP连接方式,在设计聊天方案时,实行将所有信息发往服务器端,再由服务器进行分别处理的思路,服务器端是所有信息的中心。 由于服务器端要...

    java网络编程[匿名群聊聊天室]

    首先,Java Socket编程是实现网络通信的基础。Sockets是TCP/IP协议栈的一部分,它允许两个网络端点(通常是服务器和客户端)进行双向通信。在群聊应用中,服务器需要创建一个监听Socket来等待客户端的连接请求。一旦...

    网络编程实验报告——基于socket聊天系统、delphi的系统报告

    【网络编程实验报告——基于socket聊天系统...通过这次实验,参与者不仅学习了网络编程的基础知识,还积累了实践经验,对于理解Socket编程和Delphi开发有了更深入的认识,为进一步开发更复杂的网络应用打下了坚实基础。

    nodejs + socketio 实现私聊 群聊

    现在,让我们关注这个项目的核心功能——私聊和群聊的实现。 私聊(Private Chat): 私聊是指用户之间的点对点通信,只有发送方和接收方能接收到消息。在Node.js和Socket.IO中,这通常通过为每个用户分配一个唯一...

    基于HP-Socket的局域网通信工具(仿QQ)

    本项目——“基于HP-Socket的局域网通信工具(仿QQ)”,就是这样一个实例,它通过HP-Socket库实现了类似QQ的功能,包括登录验证、用户注册和好友间的即时聊天。 首先,HP-Socket是专为Java设计的一个高性能、轻量...

    分布式计算实验-基于P2P范型的即时聊天系统.rar

    本次系统开发主要涉及到socket编程技术和多线程技术。为了保证数据收发的可靠性,本系统选择的是基于面向连接的通信方式,即用TCP套接字实现网络通信。套接字是通信的基础,这是支持网络通信协议的基本接口,套接字...

    控制台群聊程序

    总的来说,这个控制台群聊程序通过C++的Socket编程实现了网络通信,结合多线程技术保证了高并发下的稳定运行,线程池的设计进一步优化了系统性能。这样的实现方式对于学习网络编程和多线程技术有着极好的实践价值,...

    仿照 QQ群聊 TCP协议

    【标题】"仿照QQ群聊TCP协议"的实现涉及到了计算机网络中的传输层协议——TCP(Transmission Control Protocol)以及C#编程语言的应用。TCP是一种面向连接、可靠的、基于字节流的传输层通信协议,它确保了数据的正确...

    仿QQvs2010的群聊程序

    ### 仿QQ vs2010的群聊程序——基于MFC与Socket技术实现 #### 概述 本文将深入探讨如何使用MFC(Microsoft Foundation Classes)和Socket编程技术来开发一个模仿QQ的群聊应用。该应用仅实现了群聊功能,并基于...

    new qq chat program

    在这个聊天程序中,Java的Socket编程是实现客户端与服务器端通信的关键。Socket提供了一种在不同主机间建立连接并进行数据交换的方式,使得聊天功能得以实现。 群聊功能的实现,通常需要一个服务器来管理多个客户端...

    Java聊天室项目——橙汁聊天室.zip

    《Java聊天室项目——橙汁聊天室》是一个基于Java实现的简单聊天室应用,它集成了群聊和私聊功能,允许用户进行实时交流,并且支持文件的上传和下载。这个项目不仅为用户提供了一个互动的沟通平台,还通过UDP协议...

    java做的简单的聊天室,课程设计用

    1. TCP Socket编程:使用 `ServerSocket` 和 `Socket` 实现服务器与客户端的连接。 2. 多线程:处理多个客户端连接和广播消息。 3. 字符串和字节流的转换:确保数据在网络间正确传输。 4. GUI编程:使用Swing创建...

    网络编程技术课程设计报告样本.doc

    《网络编程技术课程设计报告——基于C/S模式的简单聊天软件》 网络编程技术是计算机科学中的重要领域,尤其在当今互联网高度发达的时代,网络通信技术对于构建分布式系统和服务至关重要。本篇报告将详述一个基于C/S...

    、简单的实现QQ的聊天功能

    在实现过程中,我们需要用到socket编程来创建客户端和服务端的连接。 1. **登录与注册**:QQ登录过程通常涉及到账号验证,这需要一个服务器端的数据库来存储用户信息。客户端通过输入用户名和密码,向服务器发送...

    Liaotianshi.rar_java liaotians_java 聊天_聊天

    本文将深入探讨一个基于JAVA实现的简单聊天室程序,该程序具备群聊功能以及聊天记录保存,为读者提供一个学习和参考的实例。 首先,我们要理解JAVA聊天室程序的核心概念。JAVA聊天室主要基于Socket编程,Socket是...

    C#项目实践——制作自己的聊天工具 Myqq

    C#提供了套接字(Socket)编程接口,可以用来实现客户端和服务器之间的网络通信。开发者需要设计一个消息协议,规定消息的格式,包括消息类型、发送者、接收者和内容等字段。 3. **聊天界面**:用户界面是与用户...

    java QQ聊天系统

    1. **网络编程**:在Java中,Socket编程是实现网络通信的基础。QQ聊天系统需要客户端与服务器之间的数据传输,这就需要用到ServerSocket和Socket类来创建服务端和客户端连接。通过输入/输出流进行数据的发送和接收,...

    TCP通讯——正式版.rar

    在实现过程中,可以通过socket编程获取本地的IP地址,并建立起客户端与服务器之间的连接。 TCP通讯过程主要包括以下几个步骤: 1. 建立连接:客户端发起连接请求,服务器响应并确认,然后客户端再次确认,形成三次...

    web通讯功能

    本项目模拟了QQ的实时通讯功能,包括群聊、上线及下线通知,这涉及到了网络编程中的核心技术——Socket通信。下面我们将深入探讨这个话题。 首先,Socket是网络编程中的基本组件,它为应用程序提供了低级别的网络...

    网络聊天程序-java课程设计

    在Java中,`java.net.Socket` 和 `java.net.ServerSocket` 类用于实现Socket编程。服务器端使用`ServerSocket`类创建监听套接字,并调用`accept()`方法等待客户端连接。一旦有连接请求,`accept()`会返回一个新的`...

Global site tag (gtag.js) - Google Analytics