多线程Java Socket编程示例

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
                                                 多线程Java Socket编程示例

这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.

1.服务端
package  sterning;

import  java.io.BufferedReader;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.InputStreamReader;
import  java.io.OutputStream;
import  java.io.PrintWriter;
import  java.net. * ;
import  java.util.concurrent. * ;

public   class  MultiThreadServer  {
    
private int port=8821;
    
private ServerSocket serverSocket;
    
private ExecutorService executorService;//线程池
    private final int POOL_SIZE=10;//单个CPU线程池大小
    
    
public MultiThreadServer() throws IOException{
        serverSocket
=new ServerSocket(port);
        
//Runtime的availableProcessor()方法返回当前系统的CPU数目.
        executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
        System.out.println(
"服务器启动");
    }

    
    
public void service(){
        
while(true){
            Socket socket
=null;
            
try {
                
//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
                socket=serverSocket.accept();
                executorService.execute(
new Handler(socket));
                
            }
 catch (Exception e) {
                e.printStackTrace();
            }

        }

    }

    
    
public static void main(String[] args) throws IOException {
        
new MultiThreadServer().service();
    }


}


class  Handler  implements  Runnable {
    
private Socket socket;
    
public Handler(Socket socket){
        
this.socket=socket;
    }

    
private PrintWriter getWriter(Socket socket) throws IOException{
        OutputStream socketOut
=socket.getOutputStream();
        
return new PrintWriter(socketOut,true);
    }

    
private BufferedReader getReader(Socket socket) throws IOException{
        InputStream socketIn
=socket.getInputStream();
        
return new BufferedReader(new InputStreamReader(socketIn));
    }

    
public String echo(String msg){
        
return "echo:"+msg;
    }

    
public void run(){
        
try {
            System.out.println(
"New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
            BufferedReader br
=getReader(socket);
            PrintWriter pw
=getWriter(socket);
            String msg
=null;
            
while((msg=br.readLine())!=null){
                System.out.println(msg);
                pw.println(echo(msg));
                
if(msg.equals("bye"))
                    
break;
            }

        }
 catch (IOException e) {
            e.printStackTrace();
        }
finally{
            
try {
                
if(socket!=null)
                    socket.close();
            }
 catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

}

2.客户端
package  sterning;

import  java.io.BufferedReader;
import  java.io.IOException;
import  java.io.InputStreamReader;
import  java.io.OutputStream;
import  java.net.Socket;
import  java.util.concurrent.ExecutorService;
import  java.util.concurrent.Executors;

public   class  MultiThreadClient  {
    
    
public static void main(String[] args) {
        
int numTasks = 10;
        
        ExecutorService exec 
= Executors.newCachedThreadPool();

        
for (int i = 0; i < numTasks; i++{
            exec.execute(createTask(i));
        }


    }


    
// 定义一个简单的任务
    private static Runnable createTask(final int taskID) {
        
return new Runnable() {
            
private Socket socket = null;
            
private int port=8821;

            
public void run() {
                System.out.println(
"Task " + taskID + ":start");
                
try {                    
                    socket 
= new Socket("localhost", port);
                    
// 发送关闭命令
                    OutputStream socketOut = socket.getOutputStream();
                    socketOut.write(
"shutdown/r/n".getBytes());

                    
// 接收服务器的反馈
                    BufferedReader br = new BufferedReader(
                            
new InputStreamReader(socket.getInputStream()));
                    String msg 
= null;
                    
while ((msg = br.readLine()) != null)
                        System.out.println(msg);
                }
 catch (IOException e) {                    
                    e.printStackTrace();
                }

            }


        }
;
    }

}


从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况.再结合我之前的例子--- Java基于Socket文件传输示例,就可以实现多线程文件的传输了
Java Socket实用样例 一、前言 最近用到了JavaSocket通信。 在搜索用法的过程中,发现好多都是用System.in举例的; 但是实际工作中,并不是用System.in从控制台输入消息的,不太好用。 以下是个人从工作中总结的Socket实用代码样例。 二、服务器端(ServerSocket服务器端等待Socket连接的建立,接收Socket请求报文,处理后给Socket客户端返回响应报文。 1.SocketThread类,主要处理类,用来接收Socket请求报文、处理、返回响应报文。 @Slf4j public cl 阅读详情

相关推荐

Java Socket几个简单的入门示例

Socket是面向网络传输层的编程接口,需要程序员直面网络连接,字节流的读写,数据包的解析等。其难点在于服务端的迸发性能处理、数据格式的定义与拆解,在程序底层的算法上会有一定要求,更加考验程序员的编程技巧。

杂七杂八 5233

Java Socket网络编程的经典例子(转)

事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作。Socket就是其中之一,对于Java而言,这些Api存在与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了。 网络编程的基本模型就是客户机到服务器模 型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数 据的通

fwdwqdwq的博客 1147

Java Socket编程

Java Socket编程        对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket。服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了。首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行...

Elim的博客 266

Java-Socket(案例)

套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。通信的两端都要有Socket,是两台机器间通信的端点网络通信其实就是Socket间的通信。Socket允许程序把网络连接当成一个流,数据在两个Socketl间通过IO传输。一般主动发起通信的应用程序属客户端,等待通信请求的为服务端基于客户端一服务端的网络通信底层使用的是TCP/IP协议应用场景举例:客户端发送数据,服务端接受并显示控制台基于Socket的TCP编程

BASK2312的博客 691

java socket多线程编程_多线程Java Socket编程示例

#re: 多线程Java Socket编程示例回复更多评论2010-05-09 14:05 by 诗特林fans服务器端:public class MultiThreadServer {private int port=8821;private ServerSocket serverSocket;private ExecutorService executorService;//线程池p...

weixin_30086969的博客 339

android socket 多线程编程,多线程Java Socket编程示例

package sterning;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java...

weixin_39845306的博客 130

java socket 文件夹_Java编程利用socket多线程访问服务器文件代码示例

这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码。接下来进入正文,我们看看利用socket多线程访问服务器代码:ServerMain.javapackage com.ysk.webServer;import java.io.File;import j...

weixin_36310376的博客 165

java socket多线程编程_Java Socket多线程编程示例

客户端代码如下:import java.io.*;import java.net.*;import java.util.Scanner;public class SimpleChatClient {BufferedReader reader;PrintWriter writer;Socket sock;public void go(){System.out.println("客户端启动!");se...

weixin_32892145的博客 165

java socket多线程编程_Java socket 多线程编程 示例

packagecom.my.socket.test;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.PrintWriter;importja...

weixin_29534463的博客 120

Java socket 多线程编程 示例

转载https://www.cnblogs.com/qqzy168/p/3772215.html 参照网上代码: 1.工程:   2.代码: Client.java package com.my.socket.test; import java.io.BufferedReader; import java.io.IOException; import ja

fengxinziyangyang的专栏 2528

[Java语言] Java Socket多线程编程示例

客户端代码如下: import java.io.*; import java.net.*; import java.util.Scanner; public class SimpleChatClient { BufferedReader reader; PrintWriter writer; Socket sock; http://m.nvzi91.cn/fuj

hxm102581的博客 374

java socket 高级编程_Java Socket多线程编程示例详解

客户端代码如下:import java.io.*;import java.net.*;import java.util.Scanner;public class SimpleChatClient {BufferedReader reader;PrintWriter writer;Socket sock;public void go(){System.out.println("客户端启动!");se...

weixin_35411438的博客 201
上一篇: 将mysql安装到d盘的mysql目录后如何启动
下一篇: FCKeditor的几点重要改进和使用心得,值得分享
goby2008
博客等级 码龄23年 12粉丝 354原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值