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);
            }
        }

    }
}

运行效果:

时间: 2024-10-26 18:23:46

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

Java学习笔记_网络(2)

单向的客户端发送服务器端接收并显示,没有使用多线程 1 import javax.swing.*; 2 import java.awt.*; 3 import java.io.*; 4 import java.net.*; 5 import java.awt.event.*; 6 7 public class ChatClient { 8 private JTextArea text_area; 9 private PrintWriter writer; 10 private Socket s;

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

支持同时收发的客户端和服务器端 客户端 1 import javax.swing.*; 2 import java.awt.*; 3 import java.io.*; 4 import java.net.*; 5 import java.awt.event.*; 6 7 public class ChatClient { 8 private JTextArea incoming; 9 private JTextField outgoing; 10 private PrintWriter wri

Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- Android包 : android.net 包 (1接口, 19类, 3枚举, 1异常), android.net.http 包 (6类), android.net.nsd 包 (3接口, 2类), android.net.rtp (4类), android.net.sip 包 (1接口, 9类, 1

java学习笔记 第二篇 核心技术(二)

第十四章 集合类 集合类用来存放对象的引用.继承关系如下图: 14.1 Collection 接口 是层次结构中的根接口,构成Collection的单位称为元素.Collection接口不能直接使用,但该接口提供了添加元素.删除元素.管理数据的方法. Collection接口常用方法: 14.2 List 集合 包括List接口以及List集合的所有实现类.List集合中的元素允许重复,各元素循序就是对象插入的顺序 1.List接口,两个重要方法: get(int index): 获取指定索引位

Java学习笔记心得——初识Java

初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开始走进Java的世界.  Java产生的历史 Java来自于Sun公司的一个叫Green Project中撰写的程序语言,全球信息网(World Wide Web)兴起,Java Applet成为网页互动技术的代表,特别适合于Internet应用程序开发. Java语言的特点 1.面向对象 这是Java最重要

java学习笔记16--异常

java学习笔记16--异常 异常 异常时导致程序中断运行的一种指令流,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失, 所以在程序的设计中必须要考虑各种异常的发生,并正确的做好相应的处理,这样才能保证程序正常的执行. 异常类的继承结构 在整个java的异常结构中,实际上有以下两个最常用的类:Exception.Error,这两个类全都是Throwable的子类 Exception:一般表示的是程序中出现的问题,可以直接使用try...catch处理. Error:一般指

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

Maven学习笔记之——三套生命周期

Maven学习笔记之--三套生命周期 Maven命令的输入往往就对应了生命周期.比如mvncompile就表示执行默认生命周期阶段compile.Maven的生命周期是抽象的.其实际行为都是由插件完成的.比如mvncompile就可能会由maven-compile-plugin完成.生命周期和插件是协同工作. 1.    何为生命周期 项目构件中进行的清理.编译.测试及部署都可以视作一个一个项目的生命周期.但是每个项目每个人都有不一样的顺序不一样的实现方式.没有统一性带来的不方便已经不言而喻.

java学习笔记16--I/O流和文件

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理设备之间的数据传输,对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中 输入/输出流可以从以下几个方面进行分类 从流的方向划分: 输入流.输出流 从流的分工划分: 节点流.处理流 从流的内容划分: 面向字符的流.面向字节的流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对