`
lvwenwen
  • 浏览: 934122 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

多线程Socket实用例子

阅读更多
文章路径:http://javasam.iteye.com/blog/1484307
简单实用的Socket例子--服务端+客户端:
http://javasam.iteye.com/blog/1484173
Java代码 
/**服务端**/ 
 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.Socket; 
 
public class ThreadServer extends Thread { 
 
    private Socket server; 
    private BufferedReader reader; 
    private PrintWriter writer; 
 
    public ThreadServer(Socket socket) throws IOException { 
        server = socket; 
        reader = new BufferedReader(new InputStreamReader( 
                server.getInputStream()));//创建输入流 
        writer = new PrintWriter(new OutputStreamWriter( 
                server.getOutputStream()));//创建输出流 
        start(); 
    } 
 
    public void run() { 
        try { 
            while (true) { 
                String str = reader.readLine();//读取客户端传来的请求 
                if (str.equals("END")) 
                    break; 
                System.out.println("Echoing:" + str); 
                writer.println(str);//打印请求信息 
            } 
        } catch (IOException e) { 
        } finally { 
            try { 
                server.close(); 
            } catch (IOException e) { 
            } 
        } 
    } 
 
        /**main启动服务器**/ 
    static final int PORT = 8080; 
    public static void main(String[] args)  throws IOException{ 
        ServerSocket server  = new ServerSocket(PORT);//启动服务器 
        System.out.println("Server Started:" + server); 
        try{ 
            while(true){ 
                Socket socket = server.accept();//进入阻塞状态准备接收数据 
                try { 
                    new ThreadServer(socket);//创建服务线程 
                } catch (IOException e) { 
                    socket.close(); 
                } 
            } 
        }finally{ 
            server.close(); 
        } 
    } 

/**客户端**/ 
package com.net; 
 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
 
 
public class ThreadClient extends Thread { 
 
    private Socket client;//客户端套接字(浏览器等等) 
    private BufferedReader reader;//输入流 
    private PrintWriter writer;//输出流 
    private static int counter = 0;//请求数量 
    private int id = counter++;//请求id 
    private static int threadcount = 0;//线程数量 
 
    public  static int getThreadCount() { 
        return threadcount; 
    } 
    public ThreadClient(InetAddress address){ 
        System.out.println("Making client" + id); 
        threadcount ++; 
        try{ 
            client = new Socket(address,MultiJobServer.PORT);//发送请求到指定地址+端口 
        }catch (IOException e) { 
        } 
         
        try { 
            reader = new BufferedReader(new InputStreamReader(client.getInputStream()));//初始化输入流 
            writer = new PrintWriter(new OutputStreamWriter(client.getOutputStream()),true);//初始化输出流 
            start();//开始线程 
        } catch (IOException e) { 
            try { 
                client.close(); 
            } catch (IOException e2) { 
            } 
        } 
    } 
    public void run(){ 
        try { 
            for(int i = 0 ; i < 25 ; i ++){ 
                writer.println("Client " + id + ":" + i);//发送请求信息 
                String str = reader.readLine();//接收返回的信息 
                System.out.println(str);//打印返回数据 
            } 
            writer.println("END"); 
        } catch (Exception e) { 
        }finally{ 
            try { 
                client.close(); 
            } catch (IOException e) { 
            } 
            threadcount --; 
        } 
    } 
 
    static final int MAX_THREADS = 4000;//最大线程数 
    @SuppressWarnings("static-access") 
    public static void main(String[] args) throws UnknownHostException, InterruptedException { 
        InetAddress address = InetAddress.getByName(null);//得到本机地址 
        while(true){ 
            if(ThreadClient.getThreadCount() < MAX_THREADS){ 
                new ThreadClient(address);//发送请求 
                Thread.currentThread().sleep(100);//休眠100毫秒后继续请求 
            } 
        } 
    } 


/**服务端**/ 
 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
 
public class Server { 
 
    public static final int PORT = 8080; 
    public static void main(String[] args) throws IOException { 
        ServerSocket server = new ServerSocket(PORT); 
        System.out.println("Started " + server); 
        try { 
            Socket client = server.accept(); 
            try { 
                System.out.println("Connection accepted: " + client); 
                BufferedReader  reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
                PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true); 
                while(true){ 
                    String str = reader.readLine(); 
                    if(str.equals("END"))break; 
                    System.out.println("Echoing:" + str); 
                    writer.println(str); 
                } 
            } finally{ 
                System.out.println("closing..."); 
                client.close(); 
            } 
        } finally{ 
            server.close(); 
        } 
         
    } 

Java代码 
/**客户端**/ 
 
import java.io.BufferedOutputStream; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
 
public class Client { 
    public static void main(String[] args) throws IOException { 
        InetAddress address = InetAddress.getByName(null); 
        System.out.println("address:" + address); 
        Socket client = new Socket(address,JobServer.PORT); 
        try{ 
            System.out.println("socket:" + client); 
            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
            PrintWriter writer = new PrintWriter(new BufferedOutputStream(client.getOutputStream()),true); 
            for(int i = 0; i < 10 ; i++){ 
                writer.println("howdy " +  i); 
                String str = reader.readLine(); 
                System.out.println(str); 
            } 
            writer.println("END"); 
        }finally{ 
            System.out.println("closing..."); 
            client.close(); 
        } 
    } 
分享到:
评论

相关推荐

    一些实用的j2me模板程序

    音乐的控制,rms的操作类,java字符串解析 将字符串解析成字符数组,java进度条实例模板,j2me中将对象转换成字节数组的方法,j2me联网测试,j2me多线程的应用实例,j2me Socket通信例子 客户端,服务器端

    vc++ 开发实例源码包

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_1

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_2

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_6

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_5

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_3

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    android开发资料大全

    在Android中实现多线程断点下载 Android提高篇内容整理 android移动开发案例精选 Android通过画线实现button效果 Android如何防止apk程序被反编译 Android 之 AIDL 和远程 Service 调用 Android 相对布局技巧 ...

    亮剑.NET深入体验与实战精要2

    4.11 创建多线程应用程序 191 4.12 WinForm开发常见问题 194 4.12.1 如何设置运行时窗体的起始位置 194 4.12.2 如何使一个窗体在屏幕的最顶端 194 4.12.3 实现窗体渐显效果 194 4.12.4 设置窗口背景为渐变色 195 ...

    亮剑.NET深入体验与实战精要3

    4.11 创建多线程应用程序 191 4.12 WinForm开发常见问题 194 4.12.1 如何设置运行时窗体的起始位置 194 4.12.2 如何使一个窗体在屏幕的最顶端 194 4.12.3 实现窗体渐显效果 194 4.12.4 设置窗口背景为渐变色 195 ...

    Python核心编程第二版(ok)

     2.20 实用的函数   2.21 练习   第3章 Python基础   3.1 语句和语法   3.1.1 注释(#)   3.1.2 继续()   3.1.3 多个语句构成代码组()   3.1.4 代码组由不同的缩进分隔   3.1.5 同一...

    Python核心编程第二版

     2.20 实用的函数   2.21 练习   第3章 Python基础   3.1 语句和语法   3.1.1 注释(#)   3.1.2 继续(\)   3.1.3 多个语句构成代码组(:)   3.1.4 代码组由不同的缩进分隔   3.1.5 ...

    bl-api-cloud,可扩展轻云服务端框架-易语言

    应用程序能够根据不同的容量要求、通信规模和资源状况等现实场景调整 HP-Socket 的各项性能参数(如:工作线程的数量、缓存池的大小、发送模式和接收模式等),优化资源配置,在满足应用需求的同时不必过度浪费资源...

    java源码包---java 源码 大量 实例

     Java语言开发的简洁实用的日期选择控件,源码文件功能说明:  [DateChooser.java] Java 日期选择控件(主体类) [public]  [TablePanel.java] 日历表格面板  [ConfigLine.java] 控制条类  [RoundBox.java] ...

    JAVA上百实例源码以及开源项目

     Java语言开发的简洁实用的日期选择控件,源码文件功能说明:  [DateChooser.java] Java 日期选择控件(主体类) [public]  [TablePanel.java] 日历表格面板  [ConfigLine.java] 控制条类  [RoundBox.java] ...

    JAVA上百实例源码以及开源项目源代码

     Java语言开发的简洁实用的日期选择控件,源码文件功能说明:  [DateChooser.java] Java 日期选择控件(主体类) [public]  [TablePanel.java] 日历表格面板  [ConfigLine.java] 控制条类  [RoundBox.java] ...

Global site tag (gtag.js) - Google Analytics