Java学习笔记(3)----网络套接字服务器多线程版本
本例给出一个客户端程序和一个服务器程序。客户端向服务器发送数据。服务器接收数据,并用它来生成一个结果,然后将这个结果返回给客户端。客户端在控制台上显示结果。在本例中,客户端发送的数据是圆的半径,服务器生成的结果是圆的面积。
客户端通过输出流套接字的 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)----网络套接字服务器多线程版本的更多相关文章
- 【原】Java学习笔记034 - 网络
package cn.temptation; import java.net.InetAddress; public class Sample01 { public static void main( ...
- Python Web学习笔记之socket套接字
套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了建立通信通道,网络通信 ...
- 7.4 (java学习笔记)网络编程之TCP
一.TCP 1.1 TCP(Transmission Control Protocol 传输控制协议),是一种面向连接的,安全的传输协议,但效率相比于UDP而言比较低. TCP传输时需要确保先建立连接 ...
- Java学习笔记_网络+多线程
支持同时收发的客户端和服务器端 客户端 import javax.swing.*; import java.awt.*; import java.io.*; import java.net.*; im ...
- Java学习笔记_网络(2)
单向的客户端发送服务器端接收并显示,没有使用多线程 import javax.swing.*; import java.awt.*; import java.io.*; import java.net ...
- java学习笔记_网络
客户端 import java.io.*; import java.net.*; public class DailyAdviceClient { public void go() { try { S ...
- 20145330第十周《Java学习笔记》
20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...
- Java Socket:飞鸽传书的网络套接字
在古代,由于通信不便利,一些聪明的人就利用鸽子会飞且飞得比较快.会辨认方向的优点,对其进行了驯化,用来进行消息的传递——也就是所谓的“飞鸽传书”.而在 Java 中,网络套接字(Socket)扮演了同 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
随机推荐
- HDU 4508 湫湫系列故事——减肥记I
原题链接:点击此处 解题思路: 思路与01背包差不多,思路用二维数组表示: dp[i][v]=max{dp[i-1][v-k*b[i]]+k*a[i]|0<=k*b[i]<=v} 其dp( ...
- 使用Vue写一个登陆页面并在管理页面查看和修改
注册页面代码如下html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- .crx 文件修改
.crx 文件类型:Chrome Extension 扩展名为.crx的文件是一个插件文件. 解压:使用7zip 修改: notepad++ 打包: Chrome 扩展项
- Spring Boot中自动执行sql脚本
说明:所有的代码基于SpringBoot 2.0.3版本 背景 在应用程序启动后,可以自动执行建库.建表等SQL脚本.下文中以要自动化执行people.sql脚本为例说明,脚本在SpringBoot工 ...
- (转)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 ...
- VS生成Map文件
一.右键项目属性->链接器->启用增量链接:关闭,选择 否 (/INCREMENTAL:NO) 二.右键项目属性->链接器->调试-> 生成调试信息:是 (/DEBUG ...
- 003javascript语句
javascript语句和java差不多,注意==和===区别 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" " ...
- AMQP技术术语
什么是AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.基 ...
- secret
## 概览 Secret是用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥.这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的 ...
- sgu-203 Hyperhuffman(哈夫曼编码)
Hyperhuffman You might have heard about Huffman encoding - that is the coding system that minimizes ...