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

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

//Server.java

package src;

import java.awt.BorderLayout;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea; public class Server extends JFrame {
private JTextArea jta=new JTextArea();
private ExecutorService executor=Executors.newCachedThreadPool(); public static void main(String[] args){
new Server();
} public Server(){
setLayout(new BorderLayout());
add(new JScrollPane(jta),BorderLayout.CENTER);
setTitle("Server");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true); try{
ServerSocket serverSocket=new ServerSocket(8000);
jta.append("Server started at "+new Date()+'\n');
while(true){
Socket socket=serverSocket.accept();
executor.execute(new Task(socket)); //对接收到的新的连接,启动一个新的线程
}
}
catch(IOException ex){
System.err.println(ex);
}
finally{
executor.shutdown();
}
} private class Task implements Runnable{
private Socket socket; public Task(Socket socket){
this.socket=socket;
} @Override
public void run() { //在线程中执行对客户端的应答
// TODO Auto-generated method stub
try{
DataInputStream inputFromClient=new DataInputStream(socket.getInputStream());
DataOutputStream outputToClient=new DataOutputStream(socket.getOutputStream());
while(true){
double radius=inputFromClient.readDouble();
double area=radius*radius*Math.PI;
outputToClient.writeDouble(area);
jta.append("######## From client -["+socket.getInetAddress()+":"+socket.getPort()+"]-Radius = "+radius+"\n");
jta.append("******** Area is---- "+area+'\n');
}
}
catch(IOException ex){
System.err.println(ex);
}
} }
}

//Client.java

package src;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket; import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField; public class Client extends JFrame {
private JTextField jtf=new JTextField();
private JTextArea jta=new JTextArea();
private DataOutputStream toServer;
private DataInputStream fromServer;
private Socket socket; public static void main(String args[]){
new Client();
} public Client(){
JPanel panel=new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JLabel("Enter radius"),BorderLayout.WEST);
panel.add(jtf, BorderLayout.CENTER);
jtf.setHorizontalAlignment(JTextField.RIGHT);
setLayout(new BorderLayout());
add(panel,BorderLayout.NORTH);
add(new JScrollPane(jta), BorderLayout.CENTER);
jtf.addActionListener(new TextFieldListener());//some thing wrong setTitle("Client");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
try{
socket=new Socket("localhost",8000);
fromServer=new DataInputStream(socket.getInputStream());
toServer=new DataOutputStream(socket.getOutputStream()); }
catch(IOException ex){
jta.append(ex.toString()+'\n');
}
}
private class TextFieldListener implements ActionListener{ @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try{
double radius=Double.parseDouble(jtf.getText().trim());
toServer.writeDouble(radius);
toServer.flush(); double area=fromServer.readDouble();
jta.append("----------- Radius is "+radius+'\n');
jta.append("$$$$$$$$$$$ From server -["+socket.getInetAddress()+":"+socket.getPort()+"] Area= "+area+'\n');
}
catch(IOException ex){
System.err.println(ex);
}
} }
}

运行效果:

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. C++类的构造函数及定义

    定义一个普通的类时,一定要定义它自己的构造函数.原因有三:第一个原因是编译器只有在发现类不包含任何构造函数的情况下才会替我们生成一个默认的构造函数,一旦我们定义了一些其他的构造函数,那么除非我们再定义 ...

  2. docker仓库harbor镜像列表获取命令

    2019-03-14 搭建好docker仓库harbor之后,在服务器上获取harbor的所有镜像列表命令 curl -u "harbor账号:密码" -X GET -H &quo ...

  3. php 判断字符串之间包含关系

    之前常用stristr ,  strpos判断. 因为处理1000W * 1000W级别,循环就是漫长漫长... 在此,对stristr, strpos, explode判断字符串包含关系处理速度对比 ...

  4. OAuth机制原理(开放授权机制)

    1.简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是安全的. 国 ...

  5. Maven仓库汇总

    来源:http://tianya23.blog.51cto.com/1081650/386908 1.maven 仓库地址: 共有的仓库http://repo1.maven.org/maven2/ht ...

  6. JavaScript数据结构-6.优先队列

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 快速排序分析及实现(C++)

    目录 快速排序算法分析及实现(C++) 算法思想 快速排序步骤 优点分析 C++语言实现 快速排序算法分析及实现(C++) 算法思想 ​ 把n个元素划分为三段:左端Left,中间段middle和右端r ...

  8. 【转】WinForm窗体显示和窗体间传值

    以前对WinForm窗体显示和窗体间传值了解不是很清楚 最近做了一些WinForm项目,把用到的相关知识整理如下 A.WinForm中窗体显示 显示窗体可以有以下2种方法: Form.ShowDial ...

  9. ASP.ENT前台更改绑定数据的日期格式

    1.Eval和Bind的区别 绑定表达式 < %# Eval("字段名") %> < %# Bind("字段名") %> 区别 1.ev ...

  10. 最近在研究asp.net mvc

    看了很多大牛写的博客,依然对mvc云里雾里. 有一点是毋庸置疑的C应该是一座桥梁建立在model和view之间. 在ASP.NET MVC中,控制器通常是继承System.Web.Mvc.Contro ...