套接字的多线程技术

上一次的用的套接字如果不受到数据就会有阻塞

我们可以使用多线程技术,把数据发过去,由服务器端的线程来操作,一个线程操作一个发过去的数据,然后发回来,不会阻塞客户端

测试代码

客户端

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.URL;
import java.util.Scanner;

public class Test {
    public static void main(String args[]){
        DataInputStream in=null;
        DataOutputStream out=null;
        Socket socket1 = null;
        InetAddress ip = null;
        Read read1=null;
        Thread thread1;
        try{
            read1=new Read();
            thread1=new Thread(read1);
//            ip=InetAddress.getByName("127.0.0.1");
//            InetSocketAddress ip2=new InetSocketAddress(ip,2010);
//            System.out.println("3333");
//            if(socket1.isConnected()){}
//            else{
//                    System.out.println("3333");
//                    socket1.connect(ip2);
//                    System.out.println("222");
                    socket1=new Socket("127.0.0.1",2017);
                    in=new DataInputStream(socket1.getInputStream());
                    out=new DataOutputStream(socket1.getOutputStream());
                    read1.setInputStream(in);
                    thread1.start();
//            }
        }
        catch(Exception e){
            System.out.println("111");
            System.out.println(e.getMessage());
        }
        Scanner scanner1=new Scanner(System.in);
        for(;scanner1.hasNext();){
            double r=scanner1.nextDouble();
            try{
                out.writeDouble(r);
            }
            catch(Exception e){
                System.out.println(e.getMessage());
                System.out.println("444");
            }
        }
    }
}

class Read implements Runnable{
    private URL url;
    private DataInputStream in1;
    void setInputStream(DataInputStream a){
        in1=a;
    }
    public void run(){
        double result=0;
        for(;;){
            try{
                result=in1.readDouble();
                System.out.println("受到了"+result);
            }
            catch(Exception e){
                System.out.println("333");
                System.out.println(e.getMessage());
            }
        }
    }
}

服务器端

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class test2{
    public static void main(String args[]){
        DataInputStream in=null;
        DataOutputStream out=null;
        ServerSocket serverSocket1=null;
        Socket socket1 = null;
        readAndWrite thread1;
        for(;;){
            try{
                serverSocket1=new ServerSocket(2017);

            }
            catch(Exception e){
                System.out.println("111");
                System.out.println(e.getMessage());
            }
            try{
                socket1=serverSocket1.accept();

            }
            catch(Exception e){
                System.out.println("22");
                System.out.println(e.getMessage());
            }
            if(socket1!=null)
                new readAndWrite(socket1).start();
        }
    }
}

class readAndWrite extends Thread{
    DataInputStream in=null;
    DataOutputStream out=null;
    Socket socket1;
    double a,b;
    readAndWrite(Socket socket){
        socket1=socket;
    }
    @Override
    public void run() {
        // TODO 自动生成的方法存根
        for(;;){
            try {
                in=new DataInputStream(socket1.getInputStream());
                out=new DataOutputStream(socket1.getOutputStream());
                a=in.readDouble();
                System.out.println("受到"+a);
                b=a*2;
                try{
                    Thread.sleep(3000);//故意拖慢,显示结果
                }
                catch(Exception e){
                    System.out.println(e.toString());
                }
                out.writeDouble(b);
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                System.out.println("111");
                System.out.println(e.getMessage());
            }
        }
    }

}

效果

时间: 2024-08-06 07:57:57

套接字的多线程技术的相关文章

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

本例给出一个客户端程序和一个服务器程序.客户端向服务器发送数据.服务器接收数据,并用它来生成一个结果,然后将这个结果返回给客户端.客户端在控制台上显示结果.在本例中,客户端发送的数据是圆的半径,服务器生成的结果是圆的面积. 客户端通过输出流套接字的 DataOuputStream 发送半径,服务器通过输入流套接字的 DataInputStream 接收半径.服务器计算面积,然后,通过输出流套接字的 DataOutputStream 把它发送给客户端,客户端通过输入流套接字的 DataInputS

java_socket套接字网络编程_实现多线程聊天

java编程_socket_套接字_网络编程_简易的GUI多线程聊天程序 运行效果: =============================================================== 服务器端代码: 1 package com.b510.socket1706.gui.freeechatroom; 2 3 import java.io.*; 4 import java.net.*; 5 import java.awt.*; 6 import java.awt.even

linux套接字编程之多进程多线程练习

一.概述:本次练习的是linux下的TAP/IP套接字多进程与多线程编程,功能只实现了对话.话不多说,直接上代码. 二.多进程: server.c: 1 /****************************************   2     > File Name:server.c   3     > Author:xiaoxiaohui   4     > mail:[email protected]   5     > Created Time:2016年05月15

多线程和Socket套接字

一个进程可以有多个线程一个线程至少会有一个进程 extends Thread类implements Runnable接口重写run()方法 启动线程start():1.启动一个线程 2.调用run()方法 区别:继承Thread类 资源不共享 实现Runnable接口 资源共享 还可以继承其他类 创建对象时继承Thread类 直接new对象实现Runnable接口 new Thread(构造参数:Runnable接口实现类对象): --------------------------------

27 Apr 18 GIL 多进程多线程使用场景 线程互斥锁与GIL对比 基于多线程实现并发的套接字通信 进程池与线程池 同步、异步、阻塞、非阻塞

27 Apr 18 一.全局解释器锁 (GIL) 运行test.py的流程: a.将python解释器的代码从硬盘读入内存 b.将test.py的代码从硬盘读入内存  (一个进程内装有两份代码) c.将test.py中的代码像字符串一样读入python解释器中解析执行 1 .GIL:全局解释器锁 (CPython解释器的特性) In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple na

Python网络编程(二)通过ThreadingMixIn实现多线程异步套接字程序

使用ThreadingMixIn类的特点: 在线程间共享应用的状态,与使用ForkingMixIn类相比避免进程间通信的复杂操作. 代码如下: 1 #! /usr/bin/python 2 3 import os 4 import socket 5 import threading 6 import SocketServer 7 8 SERVER_HOST = 'localhost' 9 SERVER_PORT = 0 10 BUF_SIZE = 1024 11 12 def client(ip

python 多线程队列套接字

#server端import socket import selectors import threading from threading import Thread import time import queue selector = selectors.DefaultSelector() socket_server = socket.socket() address_server = ('0.0.0.0',8080) socket_server.bind(address_server)

windows和linux套接字中的select机制浅析

先来谈谈为什么会出现select函数,也就是select是解决什么问题的? 平常使用的recv函数时阻塞的,也就是如果没有数据可读,recv就会一直阻塞在那里,这是如果有另外一个连接过来,就得一直等待,这样实时性就不是太好. 这个问题的几个解决方法:1. 使用ioctlsocket函数,将recv函数设置成非阻塞的,这样不管套接字上有没有数据都会立刻返回,可以重复调用recv函数,这种方式叫做轮询(polling),但是这样效率很是问题,因为,大多数时间实际上是无数据可读的,花费时间不断反复执行

Python之socket(套接字)

Socket 一.概述 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: file模块是针