本例给出一个客户端程序和一个服务器程序。客户端向服务器发送数据。服务器接收数据,并用它来生成一个结果,然后将这个结果返回给客户端。客户端在控制台上显示结果。在本例中,客户端发送的数据是圆的半径,服务器生成的结果是圆的面积。

  客户端通过输出流套接字的 DataOuputStream 发送半径,服务器通过输入流套接字的 DataInputStream 接收半径。服务器计算面积,然后,通过输出流套接字的 DataOutputStream 把它发送给客户端,客户端通过输入流套接字的 DataInputStream 接收面积。服务器和客户端程序在下面的程序清单中给出。

//Server.java

  1. package src;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.io.DataInputStream;
  5. import java.io.DataOutputStream;
  6. import java.io.IOException;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;
  9. import java.util.Date;
  10. import java.util.concurrent.ExecutorService;
  11. import java.util.concurrent.Executors;
  12.  
  13. import javax.swing.JFrame;
  14. import javax.swing.JScrollPane;
  15. import javax.swing.JTextArea;
  16.  
  17. public class Server extends JFrame {
  18. private JTextArea jta=new JTextArea();
  19. private ExecutorService executor=Executors.newCachedThreadPool();
  20.  
  21. public static void main(String[] args){
  22. new Server();
  23. }
  24.  
  25. public Server(){
  26. setLayout(new BorderLayout());
  27. add(new JScrollPane(jta),BorderLayout.CENTER);
  28. setTitle("Server");
  29. setSize(500, 300);
  30. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  31. setVisible(true);
  32.  
  33. try{
  34. ServerSocket serverSocket=new ServerSocket(8000);
  35. jta.append("Server started at "+new Date()+'\n');
  36. while(true){
  37. Socket socket=serverSocket.accept();
  38. executor.execute(new Task(socket)); //对接收到的新的连接,启动一个新的线程
  39. }
  40. }
  41. catch(IOException ex){
  42. System.err.println(ex);
  43. }
  44. finally{
  45. executor.shutdown();
  46. }
  47. }
  48.  
  49. private class Task implements Runnable{
  50. private Socket socket;
  51.  
  52. public Task(Socket socket){
  53. this.socket=socket;
  54. }
  55.  
  56. @Override
  57. public void run() { //在线程中执行对客户端的应答
  58. // TODO Auto-generated method stub
  59. try{
  60. DataInputStream inputFromClient=new DataInputStream(socket.getInputStream());
  61. DataOutputStream outputToClient=new DataOutputStream(socket.getOutputStream());
  62. while(true){
  63. double radius=inputFromClient.readDouble();
  64. double area=radius*radius*Math.PI;
  65. outputToClient.writeDouble(area);
  66. jta.append("######## From client -["+socket.getInetAddress()+":"+socket.getPort()+"]-Radius = "+radius+"\n");
  67. jta.append("******** Area is---- "+area+'\n');
  68. }
  69. }
  70. catch(IOException ex){
  71. System.err.println(ex);
  72. }
  73. }
  74.  
  75. }
  76. }

//Client.java

  1. package src;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.io.DataInputStream;
  7. import java.io.DataOutputStream;
  8. import java.io.IOException;
  9. import java.net.Socket;
  10.  
  11. import javax.swing.JFrame;
  12. import javax.swing.JLabel;
  13. import javax.swing.JPanel;
  14. import javax.swing.JScrollPane;
  15. import javax.swing.JTextArea;
  16. import javax.swing.JTextField;
  17.  
  18. public class Client extends JFrame {
  19. private JTextField jtf=new JTextField();
  20. private JTextArea jta=new JTextArea();
  21. private DataOutputStream toServer;
  22. private DataInputStream fromServer;
  23. private Socket socket;
  24.  
  25. public static void main(String args[]){
  26. new Client();
  27. }
  28.  
  29. public Client(){
  30. JPanel panel=new JPanel();
  31. panel.setLayout(new BorderLayout());
  32. panel.add(new JLabel("Enter radius"),BorderLayout.WEST);
  33. panel.add(jtf, BorderLayout.CENTER);
  34. jtf.setHorizontalAlignment(JTextField.RIGHT);
  35. setLayout(new BorderLayout());
  36. add(panel,BorderLayout.NORTH);
  37. add(new JScrollPane(jta), BorderLayout.CENTER);
  38. jtf.addActionListener(new TextFieldListener());//some thing wrong
  39.  
  40. setTitle("Client");
  41. setSize(500, 300);
  42. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  43. setVisible(true);
  44. try{
  45. socket=new Socket("localhost",8000);
  46. fromServer=new DataInputStream(socket.getInputStream());
  47. toServer=new DataOutputStream(socket.getOutputStream());
  48.  
  49. }
  50. catch(IOException ex){
  51. jta.append(ex.toString()+'\n');
  52. }
  53. }
  54. private class TextFieldListener implements ActionListener{
  55.  
  56. @Override
  57. public void actionPerformed(ActionEvent e) {
  58. // TODO Auto-generated method stub
  59. try{
  60. double radius=Double.parseDouble(jtf.getText().trim());
  61. toServer.writeDouble(radius);
  62. toServer.flush();
  63.  
  64. double area=fromServer.readDouble();
  65. jta.append("----------- Radius is "+radius+'\n');
  66. jta.append("$$$$$$$$$$$ From server -["+socket.getInetAddress()+":"+socket.getPort()+"] Area= "+area+'\n');
  67. }
  68. catch(IOException ex){
  69. System.err.println(ex);
  70. }
  71. }
  72.  
  73. }
  74. }

运行效果:

Java学习笔记(3)----网络套接字服务器多线程版本的更多相关文章

  1. 【原】Java学习笔记034 - 网络

    package cn.temptation; import java.net.InetAddress; public class Sample01 { public static void main( ...

  2. Python Web学习笔记之socket套接字

    套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了建立通信通道,网络通信 ...

  3. 7.4 (java学习笔记)网络编程之TCP

    一.TCP 1.1 TCP(Transmission Control Protocol 传输控制协议),是一种面向连接的,安全的传输协议,但效率相比于UDP而言比较低. TCP传输时需要确保先建立连接 ...

  4. Java学习笔记_网络+多线程

    支持同时收发的客户端和服务器端 客户端 import javax.swing.*; import java.awt.*; import java.io.*; import java.net.*; im ...

  5. Java学习笔记_网络(2)

    单向的客户端发送服务器端接收并显示,没有使用多线程 import javax.swing.*; import java.awt.*; import java.io.*; import java.net ...

  6. java学习笔记_网络

    客户端 import java.io.*; import java.net.*; public class DailyAdviceClient { public void go() { try { S ...

  7. 20145330第十周《Java学习笔记》

    20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...

  8. Java Socket:飞鸽传书的网络套接字

    在古代,由于通信不便利,一些聪明的人就利用鸽子会飞且飞得比较快.会辨认方向的优点,对其进行了驯化,用来进行消息的传递——也就是所谓的“飞鸽传书”.而在 Java 中,网络套接字(Socket)扮演了同 ...

  9. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

随机推荐

  1. HDU 4508 湫湫系列故事——减肥记I

    原题链接:点击此处 解题思路: 思路与01背包差不多,思路用二维数组表示: dp[i][v]=max{dp[i-1][v-k*b[i]]+k*a[i]|0<=k*b[i]<=v} 其dp( ...

  2. 使用Vue写一个登陆页面并在管理页面查看和修改

    注册页面代码如下html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  3. .crx 文件修改

    .crx 文件类型:Chrome Extension 扩展名为.crx的文件是一个插件文件. 解压:使用7zip 修改: notepad++ 打包: Chrome 扩展项

  4. Spring Boot中自动执行sql脚本

    说明:所有的代码基于SpringBoot 2.0.3版本 背景 在应用程序启动后,可以自动执行建库.建表等SQL脚本.下文中以要自动化执行people.sql脚本为例说明,脚本在SpringBoot工 ...

  5. (转)mysql双机热备的实现

    mysql双机热备的实现 原文:http://www.zjian.me/web/php/mysql%E5%8F%8C%E6%9C%BA%E7%83%AD%E5%A4%87%E7%9A%84%E5%AE ...

  6. VS生成Map文件

    一.右键项目属性->链接器->启用增量链接:关闭,选择  否 (/INCREMENTAL:NO) 二.右键项目属性->链接器->调试-> 生成调试信息:是 (/DEBUG ...

  7. 003javascript语句

    javascript语句和java差不多,注意==和===区别 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" " ...

  8. AMQP技术术语

    什么是AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.基 ...

  9. secret

    ## 概览 Secret是用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥.这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的 ...

  10. sgu-203 Hyperhuffman(哈夫曼编码)

    Hyperhuffman You might have heard about Huffman encoding - that is the coding system that minimizes ...