`

网络通信之server/client通信的实现

阅读更多
网络通信之server/client通信的实现

要求:实现服务器客户端通信,当服务器启动后一旦有客户端连接上服务器,服务器便给连接上的客户端发送”欢迎光临!“。每增加一个客户端,服务器都将客户端放入arraylist中,并显示在线客户端数。而客户端向服务器发送消息时,服务器会接收客户端发来的消息并将消息转发给所以在线的客户端。客户端和服务器端都有自己的发送和接收数据的线程。
服务端要求实现的功能:
      1.每连上一个客户端,就主动给客户端发送一句“欢迎光临!”。
      2.使用ArrayList存放连上服务端的所有客户端。
      3.当接收到客户端发送来的消息的时候,将这条消息转发给所有连上服务端的所有客户端。

思路:
      1.创建一个服务器套接字(ServerSocket),绑定到指定端口。
     2.调用accept方法,侦听来自客户端的请求,如果客户发出请求,则接受连接,返回通信套接字(Socket)。
      3.创建线程来处理客户机:发送和接收消息。


服务端:
//服务器端
public class MyServer {
	//使用ArrayList存放连上服务端的所有客户端
	public static ArrayList<Socket> sockets = new ArrayList<Socket>();
	public static void main(String[] args) {
			try {
				//创建一个服务器套接字,绑定到54321端口
				ServerSocket server = new ServerSocket(54321);
				System.out.println("服务器已启动,正在等待连接");
				while (true) {
					//调用accept方法,侦听来自客户端的请求
					Socket socket = server.accept();
					//将客户端发送过来的通信套接字添加到sockets动态数组中
					sockets.add(socket);
					//输出在线的客户端个数
					System.out.println("有" + sockets.size() + "个客户连接上");
					//启动发送线程,给客户端发送一句“欢迎光临!”
					new getOutputStream(socket).start();
					//启动接收线程,读取从客户端发来的消息
					new getInputStream(socket).start();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


服务端负责发送欢迎光临的线程类:
//发送线程负责给客户端发送一句“欢迎光临!”
	class getOutputStream extends Thread{
		private Socket s;
		public getOutputStream(Socket s) {
			this.s=s;
		}
		@Override
		public void run() {
			try {
				//获取输出流
				OutputStream ops= s.getOutputStream();
				String msg="欢迎光临!\n";
				//将msg写入流
				ops.write(msg.getBytes());
				//刷新流
				ops.flush();
				
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


服务器端从客户端接收数据的线程类:
//接收线程,读取从客户端发来的消息
	class getInputStream extends Thread {
		private Socket r;
		public getInputStream(Socket r) {
			this.r = r;
		}
		public void run() {
			try {
				//获取输入流
				InputStreamReader is = new InputStreamReader(r.getInputStream());
				BufferedReader br = new BufferedReader(is);
				while (true) {
					//读取客户端发送过来的消息
					String msg = br.readLine();
					System.out.println("客户端发来" + msg);
					//读取客户端发送过来的消息后转发给所有在线的客户端
					for (Socket socket : MyServer.sockets) {
						OutputStreamWriter osw = new OutputStreamWriter(
								socket.getOutputStream());
						BufferedWriter bw = new BufferedWriter(osw);
						bw.write(msg + "\n");
						//刷新流
						bw.flush();
						
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}



客户端
功能:
      1.在命令行给服务端发送消息
      2.当接收到服务端发来的消息的时候,将内容显示在控制台上
思路:
      1.创建一个套接字(Socket) ,向服务器的侦听端口发出请求
      2.与服务器正确连接后,获得输入/输出流,启动线程开始网络数据的接收和发送


客户端:
//客户端
public class MyClient {
		public static void main(String[] args) {
			try {
				//创建一个套接字(Socket) ,向服务器的侦听端口发出请求
				Socket socket = new Socket("localhost", 54321);
				//启动读取数据线程,接收服务器发送过来的消息
				new Cread(socket).start();
				//启动发送数据线程,给服务器发送消息
				new Csend(socket).start();
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


客户端接收数据的线程类:
//读取数据线程,接收服务器发送过来的消息
	class Cread extends Thread {
		private Socket r;
		public Cread(Socket r) {
			this.r = r;
		}
		public void run() {
			try {
				while (true) {
					//获取输入流
					InputStreamReader is = new InputStreamReader(r.getInputStream());
					BufferedReader br = new BufferedReader(is);
					//按行读取从服务器发来的数据消息
					String content = br.readLine();
					System.out.println("服务端发来" + content);
				}
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


客户端发送数据线程类:
//发送数据线程,给服务器发送消息
	class Csend extends Thread {
		private Socket c;
		public Csend(Socket c) {
			this.c = c;
		}
		public void run() {
			try {
				//获取输出流
				OutputStreamWriter osw = new OutputStreamWriter(c.getOutputStream());
				BufferedWriter bw = new BufferedWriter(osw);
				//从键盘写入数据
				Scanner sc = new Scanner(System.in);
				while (true) {
					//将键盘写入的数据按行写入发送给服务器
					String msg = sc.nextLine() + "\n";
					bw.write(msg);
					System.out.println("给服务器发送" + msg);
					//刷新流
					bw.flush();
				}
				
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
8
2
分享到:
评论
2 楼 Sunflower-13 2016-11-28  
Sun_TW 写道
感觉高级语言写简单一点。

1 楼 Sun_TW 2016-11-21  
感觉高级语言写简单一点。

相关推荐

    《A Simple IOCP Server/Client Class》

    项目中的`IOCPServer`和`IOCPClient`文件夹可能包含服务器和客户端的源码,这些源码会详细展示如何使用IOCP进行网络通信。通过阅读和理解这些代码,可以深入了解IOCP的具体实现细节,如错误处理、线程同步和通信协议...

    server/client 多用户通信

    在IT行业中,网络通信是核心领域之一,尤其是服务器与客户端之间的多用户通信。在这个场景下,我们通常会利用Socket编程来实现。Socket是网络通信的基本组件,它为两台计算机之间提供了一种低级别的、可靠的通信接口...

    server/client

    在IT领域,服务器/客户端(Server/Client)架构是一种常见的通信模式,特别是在网络编程中,如TCP协议的应用。本文将详细解析如何在Linux环境下实现基于TCP协议的客户端和服务器之间的通信功能。 首先,TCP...

    TCP——Server/client的网络通信

    在这个场景中,我们关注的是TCP协议在服务器与客户端之间的通信,通过两个程序——"TCPServer"和"TCPClient"来实现。 首先,我们要理解TCP服务器的工作原理。TCPServer通常是一个等待客户端连接的程序,它监听特定...

    MFC 网络通信demo server和client

    本示例中的"MFC网络通信demo server和client"是基于MFC实现的一个简单的网络通信程序,它包含了服务器(server)和客户端(client)两部分,用于演示如何在Windows环境下使用MFC进行网络编程。 MFC对网络编程的支持...

    远程控制编码server/client代码

    理解远程控制编码的关键在于掌握网络通信基础,如套接字编程、数据序列化和反序列化、以及安全通信策略。对于server/client架构,理解如何在多线程或多进程环境中处理并发连接也非常重要。此外,熟悉操作系统API,...

    TCP Server/Client Demo C#程序

    在IT行业中,网络通信是至关重要的一个领域,尤其是在软件开发中。C#作为一种强大的编程语言,提供了丰富的库和API来支持网络编程,如Socket类,它使得开发者能够创建TCP服务器和客户端应用程序。在这个"TCP Server/...

    java -> UDP Server/Client

    总的来说,这个Java UDP Server/Client示例提供了一个基础的网络通信模型,展示了如何在Java中利用UDP进行数据交换。通过深入研究这些文件,你可以学习到网络编程的基础知识,包括套接字编程、数据打包与解包,以及...

    C# Socket范例,Server/Client

    本话题主要围绕"C# Socket范例,Server/Client"这一主题展开,将深入探讨如何在C#中实现Socket服务器(Server)和客户端(Client)的交互,以及一Server对多Client的并发处理能力。 Socket,通常被称为套接字,是...

    E4A安卓App Server/Client调试助手

    【E4A安卓App Server/Client调试助手】是一款专为E4A(Easy4App)开发者设计的实用工具,它提供了便捷的网络编程环境,帮助用户在局域网内实现服务器(Server)与客户端(Client)之间的数据交互。通过这款应用,...

    c# socket Server/Client 解决消息边界问题

    总结,"C# socket Server/Client 解决消息边界问题"涉及到的不仅是网络编程的基础知识,还包括了设计和实现一个可靠、高效、健壮的网络通信系统所需的各种技巧和策略。通过理解和实践这些技术,开发者可以构建出满足...

    P2P通讯例子(server/client)

    标题中的“P2P通讯例子(server/client)”是一个关于点对点通信的实例,它涵盖了服务端和客户端的实现。在IT领域,P2P(Peer-to-Peer)通信是一种网络架构,其中每个参与者都可以作为服务提供者和消费者,而不是传统...

    wince下tcp server/client

    1. **套接字(Socket)**:套接字是进程间通信的一种接口,是网络通信的基础。在Wince中,你可以使用Winsock库来创建和操作套接字。 2. **创建套接字**:首先,调用`socket()`函数创建一个套接字,指定协议类型(如...

    OpenCV+TCP+server+client.zip

    在Python中,socket模块提供了低级网络通信接口,可以用来创建TCP服务器和客户端。在这个项目中,`TCP-Camera.py`很可能是服务器端代码,它创建一个监听特定端口的socket,等待客户端的连接请求。一旦连接建立,...

    tcp例子c# server&client

    在IT行业中,TCP(传输控制协议)是一种广泛用于网络通信的协议,因为它提供了一种可靠的、面向连接的数据传输方式。本教程将通过C#编程语言,深入解析TCP服务器(TcpServerDemo2)与客户端(ClientDemo2)的实现,...

    Client/Server通信(NamedPipe实现)

    "Client/Server通信(NamedPipe实现)" 这个标签进一步强调了主题的核心内容,即通过命名管道来实现客户端和服务器之间的通信,这通常涉及到网络编程和系统级编程的知识。 **压缩包子文件的文件名称列表:** ...

    C#通信TCP/IP server client 简单实例

    本教程将通过一个简单的C# TCP/IP Server-Client实例,帮助初学者理解如何在WinForm环境中构建网络通信程序。 首先,TCP(传输控制协议)和IP(互联网协议)是网络通信的基础,它们构成了Internet的基础。TCP是一种...

    VNC的server端和client端

    总的来说,VNC的server端和client端通过简单的网络通信协议实现了高效的远程桌面控制,为用户提供了极大的便利。RealVNC作为VNC技术的重要提供商,其产品在安全性、稳定性和易用性方面都有出色的表现,是许多企业和...

    SQL server Native Client 10.0

    这个组件在64位操作系统中尤其重要,因为它提供了对64位数据源的支持,确保了与SQL Server 2008 R2等64位数据库系统的高效通信。 1. **ODBC接口**: ODBC是SQL Server Native Client 10.0中的关键部分,它是一个...

    udp广播-server-client实例

    UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,广泛用于网络通信,尤其是在实时性要求较高的场景中,如在线视频、音频聊天等。在这个“udp广播-server-client实例”中,我们将探讨如何在...

Global site tag (gtag.js) - Google Analytics