Java_套接字举例

多线程技术


服务器接收到一个客户的套接字后,就启动一个专门为该客户服务的线程。

例题:客户端输入圆的半径并发送给服务器,服务器把计算出的圆的面积返回给客户。因此可以将计算量大的工作放在服务器端,客户端负责计算量小的工作,实现客户端-服务器交互计算来完成任务。
Server.java

package SocketClass.ServerThread;

import java.io.*;
import java.net.*;
import java.util.*;
public class Server {
    public static void main(String []args){
        ServerSocket server = null;
        ServerThread thread;
        Socket you = null;
        while (true){
            try{
                server = new ServerSocket(956);
            }catch (Exception e){
                System.out.println("正在监听");//ServerSocket对象不能重复创建
            }
            try{
                System.out.println("等待客户呼叫");
                you = server.accept();
                System.out.println("客户的地址:"+you.getInetAddress());
            }catch (Exception e){
                System.out.println("正在等待客户");
            }
            if(you!=null){
                new ServerThread(you).start();//为每个客户启动一个专门的线程
            }
        }
    }
}

class ServerThread extends Thread{
    Socket socket;
    DataOutputStream out = null;
    DataInputStream in = null;
    String s = null;
    ServerThread(Socket t){
        socket = t;
        try{
            out = new DataOutputStream(socket.getOutputStream());
            in = new DataInputStream(socket.getInputStream());
        }catch (Exception e){

        }
    }

    public void run(){
        while (true){
            try{
                double r =in.readDouble();//堵塞状态,除非读取到信息
                double area = Math.PI*r*r;
                out.writeDouble(area);
            }catch (Exception e){
                System.out.println("客户离开");
                return;
            }
        }
    }
}

Client.java

package SocketClass.ServerThread;

import java.io.*;
import java.net.*;
import java.util.*;

public class Client {
    public static void main(String []args){
        Scanner scanner = new Scanner(System.in);
        Socket mysocket = null;
        DataInputStream in = null;
        DataOutputStream out = null;
        Thread readData;
        Read read = null;
        try{
            mysocket = new Socket();
            read = new Read();
            readData = new Thread(read);
            System.out.println("输入服务器的IP:");
            String IP=scanner.nextLine();
            System.out.println("输入端口号:");
            int port = scanner.nextInt();
            if(mysocket.isConnected()){

            }else {
                InetAddress address = InetAddress.getByName(IP);
                InetSocketAddress socketAddress = new InetSocketAddress(address,port);
                mysocket.connect(socketAddress);
                in = new DataInputStream(mysocket.getInputStream());
                out = new DataOutputStream(mysocket.getOutputStream());
                read.setDataInputStream(in);
                readData.start();
            }
        }catch (Exception e){
            System.out.println("服务器已断开"+e);
        }
        System.out.println("输入圆的半径(放弃请输入N):");
        while(scanner.hasNext()){
            double radius = 0;
            try{
                radius = scanner.nextDouble();
            }catch (Exception e){
                System.exit(0);
            }
            try{
                out.writeDouble(radius);
            }catch (Exception e){

            }
        }
    }
}

class Read implements Runnable{

    DataInputStream in;
    public void setDataInputStream(DataInputStream in){
        this.in = in;
    }

    @Override
    public void run() {
        double result = 0;
        while(true){
            try{
                result = in.readDouble();
                System.out.println("圆的面积:"+result);
                System.out.println("输入圆的半径(放弃请输入N):");
            }catch (Exception e){
                System.out.println("与服务器已断开"+e);
                break;
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述
本程序为了调试方便,在建立套接字连接时,使用的服务器地址是127.0.0.1,如果服务器设置过有效的IP地址,就可以用有效的IP代替程序中的127.0.0.1.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章