[Java ] 通信

所谓可以多客户端,就是需要在服务器端进行多线程编程,每一个客户端对应一个线程。如果要实现时时通讯和话,无论是客户端还是服务器端都要至少两个线程,主线程进行发送信息,子线程进行获取信息,这样可以保证时时通信.

下面贴出我的代码:

客户端:

[java] view plaincopy

  1. package com.lip;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. import java.io.PrintWriter;
  8. import java.net.Socket;
  9. import java.util.Scanner;
  10. public class Client
  11. {
  12. /**
  13. * Author: Lip
  14. * 客户端
  15. */
  16. public static void main(String[] args)
  17. {
  18. Socket socket = null;
  19. BufferedReader br = null;
  20. PrintWriter pw = null;
  21. Scanner scanner = new Scanner(System.in);// 从键盘读取
  22. try
  23. {
  24. // 创建客户端socket
  25. socket = new Socket(Server.HOST, Server.PORT);
  26. // 读取从客户端发来的消息
  27. br = new BufferedReader(new InputStreamReader(
  28. socket.getInputStream()));
  29. // 写入信息到服务器端
  30. pw = new PrintWriter(
  31. new BufferedWriter(new OutputStreamWriter(
  32. socket.getOutputStream())));
  33. new ReadServerMessage(br);// 从服务器读取消息
  34. while (true)
  35. {
  36. String temp = scanner.nextLine();// 从键盘读取一行
  37. pw.println(temp);// 写到服务器
  38. pw.flush();
  39. if (temp.equals("q"))
  40. break;
  41. }
  42. }
  43. catch (Exception e)
  44. {
  45. e.printStackTrace();
  46. }
  47. finally
  48. {
  49. try
  50. {
  51. System.out.println("close......");
  52. br.close();
  53. pw.close();
  54. socket.close();
  55. }
  56. catch (IOException e)
  57. {
  58. e.printStackTrace();
  59. }
  60. }
  61. }
  62. }
  63. class ReadServerMessage extends Thread//从服务器读取消息
  64. {
  65. BufferedReader bReader;
  66. Socket socket;
  67. public ReadServerMessage(BufferedReader br)
  68. {
  69. this.bReader = br;
  70. start();
  71. }
  72. public void run()
  73. {
  74. String str = "";
  75. while (true)//一直等待着服务器的消息
  76. {
  77. try
  78. {
  79. str = bReader.readLine();
  80. if (str.equals("q"))
  81. {
  82. bReader.close();
  83. socket.close();
  84. break;
  85. }
  86. }
  87. catch (IOException e)
  88. {
  89. e.printStackTrace();
  90. }
  91. System.out.println("Server Message:" + str);
  92. }
  93. }
  94. }

服务器端:

[java] view plaincopy

  1. package com.lip;
  2. import java.io.IOException;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. public class Server
  6. {
  7. /**
  8. * Author:Lip Desc:SSD8_exercise1
  9. */
  10. public static int PORT = 8000;
  11. public static String HOST = "127.0.0.1";
  12. public static void main(String[] args)
  13. {
  14. ServerSocket serverSocket = null;
  15. Socket socket = null;
  16. try
  17. {
  18. serverSocket = new ServerSocket(PORT);
  19. // 等待请求,无请求一直等待
  20. while (true)
  21. {
  22. System.out.println("Waiting Client");
  23. socket = serverSocket.accept();// 接受请求
  24. System.out.println("Client Conect!");
  25. new ThreadedServer(socket);
  26. }
  27. }
  28. catch (Exception e)
  29. {
  30. try
  31. {
  32. socket.close();
  33. }
  34. catch (IOException e1)
  35. {
  36. e1.printStackTrace();
  37. }
  38. }
  39. finally
  40. {
  41. try
  42. {
  43. serverSocket.close();
  44. }
  45. catch (IOException e)
  46. {
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. }

辅助线程:

[java] view plaincopy

  1. package com.lip;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. import java.io.PrintWriter;
  8. import java.net.Socket;
  9. import java.util.Scanner;
  10. public class ThreadedServer extends Thread
  11. {
  12. private Socket socket = null;
  13. private BufferedReader br = null;
  14. private PrintWriter pw = null;
  15. private Scanner scanner = null;
  16. public ThreadedServer(Socket s)
  17. {
  18. socket = s;
  19. try
  20. {
  21. br = new BufferedReader(new InputStreamReader(
  22. socket.getInputStream()));
  23. pw = new PrintWriter(
  24. new BufferedWriter(new OutputStreamWriter(
  25. socket.getOutputStream())), true);
  26. scanner = new Scanner(System.in);// 从键盘读取数据
  27. start();
  28. }
  29. catch (Exception e)
  30. {
  31. e.printStackTrace();
  32. }
  33. }
  34. public void run()
  35. {
  36. new ReadClientMessage(br, socket);//读取客户端数据
  37. while (true)//向客户端发送数据
  38. {
  39. try
  40. {
  41. pw.println(scanner.nextLine());
  42. pw.flush();
  43. }
  44. catch (Exception e)
  45. {
  46. try
  47. {
  48. br.close();
  49. pw.close();
  50. socket.close();
  51. }
  52. catch (IOException e1)
  53. {
  54. e1.printStackTrace();
  55. }
  56. }
  57. }
  58. }
  59. }
  60. class ReadClientMessage extends Thread
  61. {
  62. BufferedReader bReader;
  63. Socket socket;
  64. public ReadClientMessage(BufferedReader br,Socket s)
  65. {
  66. this.bReader = br;
  67. this.socket=s;
  68. start();
  69. }
  70. public void run()
  71. {
  72. String str = "";
  73. while (true)
  74. {
  75. try
  76. {
  77. str = bReader.readLine();
  78. if (str.equals("q"))
  79. {
  80. bReader.close();
  81. socket.close();
  82. break;
  83. }
  84. }
  85. catch (IOException e)
  86. {
  87. e.printStackTrace();
  88. }
  89. System.out.println("Client Message:" + str);
  90. }
  91. }
  92. }

现在就可以实现多客户端和服务器端通信了 ,不过客户端和客户端的通信暂时还没有搞懂,还要继续去学习

时间: 2024-10-17 02:52:47

[Java ] 通信的相关文章

Flex Socket与Java通信实例说明(转)

Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注释,也注释了很多. 跟着走你就会懂.. Flex端 和 Java端, 先运行Java端启动服务.然后在测试Flex. 实例一: Flex端: <?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow

JavaScript与Java通信

1.WebView中JavaScript调用Android程序中Java: 使用WebView类中的addJavascriptInterface()方法,可以使用它扩展嵌入式浏览器内的DOM(文档对象模型),并定义JavaScript代码可以访问的新对象.JavaScript代码调用该对象的方法时,实际上它会调用Android程序中的方法. 2.在Android程序中调用JavaScript方法: 调用loadUrl()方法,将URL以javascript:要执行的代码 的形式传递给它.浏览器会

结对博客(Java通信项目QQ)

项目名称:JAVA通信项目——QQ 成员:邢正,郑振兰 项目需求:QQ每个人都用过,它的意义就不再讲了.之所以选择做QQ事因为它有挑战性,涉及到通信.传输.swing等各种知识.(好吧我不装逼了,说的直白点,代码量大,如果写五子棋贪吃蛇之类的绝对写不到500行) 首先整个项目分为两部分:客户端和服务器.客户端要完成的功能就是界面(主界面,好友列表,聊天界面)以及登录.聊天功能.服务器作为后台,负责通信连接.做项目时逻辑一定要清楚,类与类包与包之间的逻辑关系以及分层一定要明白 代码截图: 因为没用

Java通信编程中调用UDP协议与TCP协议之间的不同

UDP协议与TCP协议之间的区别不再分析,主要是分析一下这两个协议在Java通信编程中是如何被使用的. 首先介绍TCP,对于TCP,Java语言为它提供了良好的支持.建立TCP通信,首先需要构建服务器,并且得 到服务器的IP和端口号. TCP协议下的Socket类: java.net.Socket类代表客户端连接 java.net.ServerSocket类代表服务器端连接 Server:ServerSocket ss = new ServerSocket(5000); //创建服务器端的soc

JAVA通信系列一:Java Socket技术总结

本文是学习java Socket整理的资料,供参考. 1       Socket通信原理 1.1     ISO七层模型 1.2     TCP/IP五层模型 应用层相当于OSI中的会话层,表示层,应用层. 区别参考:http://blog.chinaunix.net/uid-22166872-id-3716751.html 1.3     TCP报文 (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记. (2)确认序号:Ack序号,占32

【Socket编程】Java通信是这样炼成的

简介 网络无处不在,移动互联时代也早已到来,单机版程序慢慢的已没有生命力,所有的程序都要能够访问网络,比如 QQ 网络聊天程序.迅雷下载程序等,这些程序都要同网络打交道,本次将与各位小伙伴们分享的就是 Java 中的网络编程—— Socket 通信. 网络基础知识 两台计算机要通过网络进行通信,必须具备如图所示的条件: a.唯一的标识(IP地址): b.需要共同的语言(协议): c.辨别不同应用程序(端口号). 其中的重要概念如下: 1.IP地址 每台计算机的唯一标识,用来区分网络中的不同主机,

几种java通信(rmi,http,hessian,webservice)协议性能比较

一.综述 本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能.RMI是java语言本身提供的通讯协议,稳定高效,是EJB的基础.但它只能用于JAVA程序之间的通讯.Hessian和Burlap是caucho公司提供的开源协议,基于HTTP传输,服务端不用开防火墙端口.协议的规范公开,可以用于任意语言.Httpinvoker是SpringFramework提供的远程通讯协议,只能用于JAVA程序间的

Flex和Java通信报错

1.错误描述 11-30 18:15:52 ERROR [localhost-startStop-1] org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:468) - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating be

js与java通信

js 调用java中的接口并传递参数给客户端处理方式: webView.addJavascriptInterface(new NewsDetail() , "newsDetail"); protected final class NewsDetail {    @JavascriptInterface  public void getContent(String imgUrl,String lineLink,String descContent,String shareTitle) {