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

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

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

服务端: 下载

Java代码  

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

服务端负责发送欢迎光临的线程类:

Java代码  

  1. //发送线程负责给客户端发送一句“欢迎光临!”
  2. class getOutputStream extends Thread{
  3. private Socket s;
  4. public getOutputStream(Socket s) {
  5. this.s=s;
  6. }
  7. @Override
  8. public void run() {
  9. try {
  10. //获取输出流
  11. OutputStream ops= s.getOutputStream();
  12. String msg="欢迎光临!\n";
  13. //将msg写入流
  14. ops.write(msg.getBytes());
  15. //刷新流
  16. ops.flush();
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }

服务器端从客户端接收数据的线程类:

Java代码  

  1. //接收线程,读取从客户端发来的消息
  2. class getInputStream extends Thread {
  3. private Socket r;
  4. public getInputStream(Socket r) {
  5. this.r = r;
  6. }
  7. public void run() {
  8. try {
  9. //获取输入流
  10. InputStreamReader is = new InputStreamReader(r.getInputStream());
  11. BufferedReader br = new BufferedReader(is);
  12. while (true) {
  13. //读取客户端发送过来的消息
  14. String msg = br.readLine();
  15. System.out.println("客户端发来" + msg);
  16. //读取客户端发送过来的消息后转发给所有在线的客户端
  17. for (Socket socket : MyServer.sockets) {
  18. OutputStreamWriter osw = new OutputStreamWriter(
  19. socket.getOutputStream());
  20. BufferedWriter bw = new BufferedWriter(osw);
  21. bw.write(msg + "\n");
  22. //刷新流
  23. bw.flush();
  24. }
  25. }
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }

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

客户端:

Java代码  

  1. //客户端
  2. public class MyClient {
  3. public static void main(String[] args) {
  4. try {
  5. //创建一个套接字(Socket) ,向服务器的侦听端口发出请求
  6. Socket socket = new Socket("localhost", 54321);
  7. //启动读取数据线程,接收服务器发送过来的消息
  8. new Cread(socket).start();
  9. //启动发送数据线程,给服务器发送消息
  10. new Csend(socket).start();
  11. } catch (UnknownHostException e) {
  12. e.printStackTrace();
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. }

客户端接收数据的线程类:

Java代码  

  1. //读取数据线程,接收服务器发送过来的消息
  2. class Cread extends Thread {
  3. private Socket r;
  4. public Cread(Socket r) {
  5. this.r = r;
  6. }
  7. public void run() {
  8. try {
  9. while (true) {
  10. //获取输入流
  11. InputStreamReader is = new InputStreamReader(r.getInputStream());
  12. BufferedReader br = new BufferedReader(is);
  13. //按行读取从服务器发来的数据消息
  14. String content = br.readLine();
  15. System.out.println("服务端发来" + content);
  16. }
  17. } catch (UnknownHostException e) {
  18. e.printStackTrace();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

客户端发送数据线程类:

Java代码  

  1. //发送数据线程,给服务器发送消息
  2. class Csend extends Thread {
  3. private Socket c;
  4. public Csend(Socket c) {
  5. this.c = c;
  6. }
  7. public void run() {
  8. try {
  9. //获取输出流
  10. OutputStreamWriter osw = new OutputStreamWriter(c.getOutputStream());
  11. BufferedWriter bw = new BufferedWriter(osw);
  12. //从键盘写入数据
  13. Scanner sc = new Scanner(System.in);
  14. while (true) {
  15. //将键盘写入的数据按行写入发送给服务器
  16. String msg = sc.nextLine() + "\n";
  17. bw.write(msg);
  18. System.out.println("给服务器发送" + msg);
  19. //刷新流
  20. bw.flush();
  21. }
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }
时间: 2024-08-11 07:40:23

网络通信之server/client通信的实现的相关文章

用XMLRPC开服务进行server/client通信

本文讲一下如何用python的xmlrpc开服务,进行server/client的通信. 应用场景:1)需多client访问应用程序给予应答情况--网页服务:  2)数据极大,希望加载一次,后面只用方法调用 解决方案:  开两个服务,一个数据服务,一个网络服务:  数据服务端加载数据,网络服务端调用数据,并将结果显示在网络服务中:  外部调用网络服务返回结果: 应用工具:xmlrpc,本文中以python 2.7.3的xmlrpclib为例,其他语言也有相应接口 下面分别说明. 1. 数据端 在

[网络篇]ESP8266-SDK教程(三)之TCP通信Server&lt;-&gt;Client

纳尼?昨天刚刚打印了个"Hello World!",今天你就让我学习TCP通信?有没有搞错~哈哈,相信很多读者会很迷,其实学习这东西嘛,单单学一些比较简单的,相信没两天就没人看了,所以咱就在基础篇和网络篇穿插着去学习一下ESP8266,毕竟兴趣才是最好的老师嘛!大家以后遇到问题了,来翻文章建议大家根据[XX篇]去快速定位该去哪一篇文章中去查找问题,当然具体会在哪一篇文章中有讲,也不一定了,后面也会穿插着写一点[项目篇][进阶篇][闲扯篇],总的来说就是,本系列文章并没有固定的路线,大家

跨平台网络通信与server编程框架库(acl库)介绍

一.描写叙述 acl project是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及server编程框架,同一时候提供很多其它的有用功能库.通过该库,用户能够很easy地编写支持多种模式(多线程.多进程.非堵塞.触发器.UDP方式)的server程序,WEB 应用程序,数据库应用程序.此外,该库还提供了常见应用的client通信库(如:HTTP.SMTP.ICMP.memcache.beanstalk),常见流式编解码库:XML/JSON/MI

基于I/O的Server/Client实现

在前面的文章中讲了基于NIO实现的Server/Client.本文就讲讲基于同步堵塞式I/O实现的Server/Client好与前面的NIO中的Server/Client进行对照. 网络编程中须要解决的两个主要问题: 1.怎样准确的定位网络上的一台或多台主机. 2.找到主机后怎样可靠高效的进行传输数据. 而解决这两个问题的主要方式就是非常好的运用TCP/IP协议.所以我们所做的网络编程都是基于TCP/IP来实现的. 基于Socket的java网络编程的通信过程: server:使用ServerS

[转] 3个学习Socket编程的简单例子:TCP Server/Client, Select

以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计socket编程就已经基本入门了. 建议:1) 多多查查所用到的网络接口; 2) 最好有一本书,如UNIX环境高级编程,UNIX网络编程,可查询:3) 可以直接使用书上的例子更好. http://blog.csdn.net/zhenjing/article/details/4770490 TCP C

Socket编程--基础(基本server/client实现)

IPv4套接口地址结构 IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件中 LINUX结构下的常用结构,一般创建套接字的时候都要将这个结构里面的值进行初始化 struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order(网络字节序) */ struct i

WIFI模块开发教程之W600网络篇1:AP模式下TCP Client通信

前言 本文研究如何在AP模式下进行TCP Client通信,所谓AP模式是说模块起来一个softAP热点,可以供其他WIFI设备连接,当其他设备连接成功后,另WIFI模块作为客户端,局域网中其他设备作为服务端进行TCP数据通信. 一.理论基础 本节要处理的有两个问题,其一是如何利用RT_Thread起来一个softAP,其二是如何使用Socket套接字编程搞定TCP Client程序编写. 1.模块开启SoftAP 模块需要起来一个名字为sand,密码为12345678的热点,RT_Thread

NetMQ(ZeroMQ)Client =&gt; Server =&gt; Client 模式的实现

ØMQ (也拼写作ZeroMQ,0MQ或ZMQ)是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库.它提供一个消息队列, 但是与面向消息的中间件不同,ZeroMQ的运行不需要专门的消息代理(message broker).该库设计成常见的套接字风格的API. ZeroMQ是由iMatix公司和大量贡献者组成的社群共同开发的.ZeroQ通过许多第三方软件支持大部分流行的编程语言 .类库提供一些套接字(对传统Berkeley套接字和Unix domain socket的泛化),每一个套接字可

C Socket Programming server client

用C语言socket编程写简单的server和client程序,目的为了测试一次socket连接中,数据从client端开始发送至server端接受完毕所耗的时间,以及找到原因和提升性能.这里贴出代码,make以后,直接运行server和client即可. sever.c /************************************ * For msmr * server_s.c * tesing the speed of socket * 2015-02-04 * [email