java代码实现socket接口通讯(堵塞I/O)

   传统的java实现socket通讯比较简单实现,不过它属于堵塞式的I/O流存取,只能由一个线程完成当前任务才能起下个一个线程,无法解决高并发;

  1、简单的socketservice

对每一个Socket连接建立一个Handler处理线程,处理线程对inputstream流中的数据进行相应的处理后,将处理结果通过PrintWriter发送给客户端,在最后需要关闭输入流、输出流和socket套接字句柄资源。

 1 public class TimeServer {
 2
 3     public static void main(String[] args) throws IOException {
 4
 5        int port = 8080;//server 端口采用8080
 6        ServerSocket server = null;
 7        Socket socket = null;
 8        try {
 9            server = new ServerSocket(port);
10            while(true){
11                socket = server.accept();
12                new Thread(new TimeHandler(socket)).start();
13            }
14        } catch (Exception e) {
15           e.printStackTrace();
16        }finally{
17            if(server!=null){
18                server.close();
19                server =null;
20                System.out.println("the time server close...");
21            }
22        }
23     }
24
25 }
26
27 class TimeHandler implements Runnable{
28
29     private Socket socket;
30
31     public TimeHandler(){
32
33     }
34     public TimeHandler(Socket socket){
35         this();
36         this.socket = socket;
37     }
38
39     public void run() {
40         System.out.println(Thread.currentThread().getName()+" start success...");
41         BufferedReader in = null;
42         PrintWriter out = null;
43         try {
44             in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
45             out = new PrintWriter(socket.getOutputStream(),true);
46             while(true){
47                 String str = in.readLine();
48                 if("end".equals(str)){
49                     break;
50                 }
51                 String time = str+":"+System.currentTimeMillis();
52                 out.println(time);
53             }
54         } catch (Exception e) {
55              e.printStackTrace();
56         }finally{
57             if(in!=null){
58                 try {
59                     in.close();
60                 } catch (IOException e) {
61                     e.printStackTrace();
62                 }
63                 in = null;
64             }
65             if(out!=null){
66                 out.close();
67                 out= null;
68             }
69             if(socket!=null){
70                 try {
71                     socket.close();
72                 } catch (IOException e) {
73                     e.printStackTrace();
74                 }
75                 socket =null;
76             }
77         }
78
79     }
80 }

2、socketclient

 1 public class TimeClient {
 2
 3     public static void main(String[] args) {
 4         int port = 8080;
 5         Socket socket = null;
 6         BufferedReader in =null;
 7         PrintWriter out =null;
 8
 9         try {
10             socket = new Socket("127.0.0.1", port);
11             in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
12             out = new PrintWriter(socket.getOutputStream(),true);
13             out.println("hello");
14             out.println("world");
15             out.println("end");
16
17             System.out.println("send message success...");
18             while(true){
19                 String res = in.readLine();
20                 if("".equals(res)||res==null){
21                     break;
22                 }
23                 System.out.println("the res is:"+res);
24             }
25
26
27         } catch (Exception e) {
28             e.printStackTrace();
29         }finally{
30             if(in!=null){
31                 try {
32                     in.close();
33                 } catch (IOException e) {
34                     e.printStackTrace();
35                 }
36                 in = null;
37             }
38             if(out!=null){
39                 out.close();
40                 out= null;
41             }
42             if(socket!=null){
43                 try {
44                     socket.close();
45                 } catch (IOException e) {
46                     e.printStackTrace();
47                 }
48                 socket =null;
49             }
50         }
51
52     }
53
54 }

原文地址:https://www.cnblogs.com/ananaini/p/9446000.html

时间: 2024-11-06 09:44:15

java代码实现socket接口通讯(堵塞I/O)的相关文章

一段非常值得珍藏的Java代码,Socket模拟容器,尽管简单但却很有意义

Tomcat.Weblogic.Jetty.WebService做了什么样子的事情呢?只不过是通过SOCKET来监听服务器上某一个端口的请求,进行请求的处理,并且将响应信息写回去.简单的说就是这样了,但是复杂里面讲呢,Tomcat必须要兼顾安全.标准.完美兼容HTTP的规范.多线程支持.数据库,数据源支持.可配置.Web端管理.SSL等等方面,所以又是非常复杂的.下面是一个例子,对于新手而言是非常有用的一段代码. package com.ziwen.container; import java.

java代码调用第三方接口

一.利用httpclient来字符串参数(url是第三方接口,不带参数,如:http://192.168.16.200:8081/faceInfo/list,param是url后面所要带的参数) public static JSONObject getHttpResponseJson(String url,Map<String,String> param){ CloseableHttpClient httpclient = null; CloseableHttpResponse respons

Java中socket接口调用

最近一个项目中接口通讯这一块主要是调用银联系统的socket接口,我方是客户端,即发送请求接收返回报文的一方.在贴代码之前,还是要了解一下关于socket的基础知识. Socket的基本概念 1.建立连接 当需要建立网络连接时,必须有一台机器运行一个程序,随时等候连接,而另一端的程序这对其发出连接请求.这一点同电话系统类似--必须有一方拨打电话,而另一方必须等候电话连通. 建立连接的过程为: (1)先在服务器端生成一个ServerSocket实例对象,随时监听客户端的连接请求. (2)当客户端需

【Java TCP/IP Socket】基于线程池的TCP服务器(含代码)

了解线程池 在http://blog.csdn.net/ns_code/article/details/14105457(读书笔记一:TCP Socket)这篇博文中,服务器端采用的实现方式是:一个客户端对应一个线程.但是,每个新线程都会消耗系统资源:创建一个线程会占用CPU周期,而且每个线程都会建立自己的数据结构(如,栈),也要消耗系统内存,另外,当一个线程阻塞时,JVM将保存其状态,选择另外一个线程运行,并在上下文转换(context switch)时恢复阻塞线程的状态.随着线程数的增加,线

socket实现人多聊天与Java代码加载过程

第一部分是java代码加载过程 关于java代码加载过程,今天调试了阿里巴巴一份代码,如下: /** * 加载方法不等于执行方法,初始化变量则会赋值 * 类加载顺序应为 加载静态方法-初始化静态变量-执行静态代码块 * 实例化时 先加载非静态方法-实例化非静态变量-执行构造代码块-执行构造函数 * @author panteng * */ public class StaticTest { /**第一个加载*/ public static int k = 0; /**第二个加载,因为是new一个

php调用webservice接口,java代码接收不到参数

前段时间做了一个项目的二次开发,有个功能是需要php调用java实现的webservice接口,并传递一些参数给接口,然后按照对方提供的接口说明文档进行传参调用,java那边有接收到请求,但是参数总是为null,部分代码如下: 1 $client = new SoapClient ($this->webServiceUrl); 2 $client->soap_defencoding = 'utf-8'; 3 $client->xml_encoding = 'utf-8'; 4 $para

java中socket网络通讯

服务器端代码: package socket; import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket; public class Server {

Java语言Socket接口用法详解

Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Server,并通过accept()方法随时监听客户端的连接请求. 扩展: ServerSocket中常用的构造函数及方法 构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

native关键字初识--java调用非java代码的接口

Java基础知识--JNI入门介绍(上) Java? 本机接口(Java Native Interface,JNI)是一个标准的 Java API,它支持将 Java 代码与使用其他编程语言编写的代码相集成.如果您希望利用已有的代码资源,那么可以使用 JNI 作为您工具包中的关键组件 -- 比如在面向服务架构(SOA)和基于云的系统中.但是,如果在使用时未注意某些事项,则 JNI 会迅速导致应用程序性能低下且不稳定. JNI 的发展JNI 自从 JDK 1.1 发行版以来一直是 Java 平台的