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

socket示例

阅读更多

 

先贴代码:

一、服务器端线程
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

/**
 * PolyLink 服务器端线程
 * @author Administrator
 * 
 */
public class PolyLinkServerThread implements Runnable {
 Socket client;
 DataInputStream input;
 DataOutputStream output;
 public PolyLinkServerThread(Socket client) throws IOException {
  this.client = client;
  input = new DataInputStream(client.getInputStream());
  output = new DataOutputStream(client.getOutputStream());
  output.flush();
  client.setSoTimeout(3000);
 }
 public void run() {
  try {
   //开始接收
   List<Integer> list = new ArrayList<Integer>();
   while(true){
    int num = 0;
    try{
     num = input.readInt();
    }catch(SocketException e){
     break;
    }catch(EOFException e){//如果读到文件末尾会发生这个异常,看JAVA的API
     break;
    }catch(Exception e){
     break;
    }
    list.add(num);
   }
   int []intArr = new int[list.size()];
   for(int i=0;i<list.size();i++){
    intArr[i] = list.get(i);
   }
   String recieveMessage =StringUtil.asciiToString(intArr);
   //开始发送回执信息
   String returnMessage = validateMessage(recieveMessage);
   int[]ascii = StringUtil.stringToAscii(returnMessage);
   for(int i:ascii){
    output.writeInt(i);
   }
   input.close();
   output.close();
   client.close();
  }catch (Exception e) {
   e.printStackTrace();
  } 
 }
 /**
  * 根据接受的消息返回一个需要返回消息的字符串
  * @return
  */
 public String validateMessage(String recieveMessage){
  System.out.println("服务器端接收到的消息为:"+recieveMessage);
  return "根据接收信息格式不同生成不同的回执信息";
 }
}

二、服务端

import java.net.ServerSocket;
import java.net.Socket;

/**
 * PolyLink服务器
 * @author Administrator
 *
 */
public class PloyLinkServer {

 public   final   static   int   PORT   =   8989;   
    /**
     * 启动PloyLinkServer服务
     * @param args
     */
    public static void startPloyLinkServer()   {   
        ServerSocket   serverSocket   =   null;   
        Socket socket = null;
        try {   
            serverSocket = new ServerSocket(PORT);   
            while (true)   {   
             socket = serverSocket.accept();
             PolyLinkServerThread lpst = new PolyLinkServerThread(socket);  
                ThreadPool.setProducerPool(lpst);
            }   
        }catch   (Exception   ex)   {   
            ex.printStackTrace();   
        }   
    }   
    public static void main(String []args) throws InterruptedException{
     startPloyLinkServer();
    }
}
三、客户端

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

/**
 * PolyLink客户端
 * @author Administrator
 *
 */
public class PolyLinkClient{
 public Socket socket = null;
 OutputStream netOut = null;
 DataOutputStream out = null;
 DataInputStream in = null;
 
 public PolyLinkClient() throws UnknownHostException, IOException{
  socket = new Socket("192.163.35.114", 8989);
  socket.setSoTimeout(10000);
  netOut = socket.getOutputStream();
  out = new DataOutputStream(netOut);
  in = new DataInputStream(socket.getInputStream());
 }
 /**
  * 给服务器发报文,并返回接收报文
  */
 public String sendMessageByASCII(String message){
  String recieveMessage = "";
  try {
   //开始发送
   int[]ascii = StringUtil.stringToAscii(message);
   out.flush();
   for(int i:ascii){
    out.writeInt(i);
   }
   //开始接收
   List<Integer> list = new ArrayList<Integer>();
   while(true){
    int num = 0;
    try{
     num =  in.readInt();
    }catch(EOFException e){
     break;
    }catch(Exception e){
     break;
    }
    list.add(num);
   }
   int []intArr = new int[list.size()];
   for(int i=0;i<list.size();i++){
    intArr[i] = list.get(i);
   }
   recieveMessage =StringUtil.asciiToString(intArr);
   in.close();
   out.close();
   socket.close();
  }catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return recieveMessage;
 }

 public static void main(String []args) throws InterruptedException, UnknownHostException, IOException{
     PolyLinkClient p = new PolyLinkClient();
     String sendMssage = "8d431f27280a4a7b8c1a0d2f29bdb9a4TART:START:66667890"+"TART:START:66667890\r\nRECV-IP:192.168.17.33\r\nRECV-PORT:1234\r\nPAYLOAD-TYPE:TS\r\n\r\n";
     String recieveMessage = p.sendMessageByASCII(sendMssage);
     System.out.println("客户端接受的消息为:"+recieveMessage);
 }
}
四、线程池

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池
 * @author Administrator
 *
 */
public class ThreadPool {
    /**
  * 构造一个线程池.核心线程一个,最大线程数100.线程队列容纳10个。超出最大线程数的处理策略为重蹈覆添加该线程,知道添加成功为止
  */
    private static ThreadPoolExecutor producerPool = new ThreadPoolExecutor(1, 100, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), new ThreadPoolExecutor.CallerRunsPolicy());
 /**
  * 把PolyLinkServerThread线程放到了线程池中,具体的线程执行由线程池操作
  * @param thread
  */
 public static void setProducerPool(PolyLinkServerThread lpst) {
  producerPool.execute(lpst);
    }
}        
五。ascii转换函数

 /**
  * 字符串转ascii码,包含中文
  * @param str
  * @return
  */
 public static int[] stringToAscii(String str) {
  char[] chars = str.toCharArray();
  int intArr[]= new int[chars.length];
  for (int i=0;i<chars.length;i++) {// 输出结果
   intArr[i] = (int)chars[i];
  }
  return intArr;
 }

代码编写过程中遇到错误多多,以前都是做个示例,没这么多错误哇。。。

错误一、

java.net.SocketException:   Connection   reset

这个是由于client端发数据的时候发完没有关闭in,out,server造成的。还有服务器端的读取in.readInt()函数也造成这个错误。另外,服务器端读取的时候,in.available()这个函数是非常非常不靠谱的。因为socket发送时候网络上的岩石,available()这个函数不能正确的反映出可读的字节数量、正确的做法是用eofException这个异常来判断读取结束。

错误二、

Exception。。。closed by peer

当服务端接受了客户端的数据以后,会向客户端发送数据,但是这个时候客户端已经关闭了!⊙﹏⊙b汗!。此时就要这样

output.flush();
client.setSoTimeout(3000);

用一下out,然后客户端等待一会儿。不知道为什吗,output.flush();这个必须要。+_+

问题三、就是要深入的研究一下这个线程池
ThreadPool。。啦啦啦这个以后再弄了
 

分享到:
评论

相关推荐

    Java Socket示例

    在本示例中,"Java Socket示例"是一个在NetBeans环境中开发的简单聊天工具,它利用了Socket来实现实时的客户端-服务器通信。下面我们将深入探讨Java Socket的基本概念、工作原理以及如何在实际应用中创建一个简单的...

    SuperSocket示例源码,带客户端和服务器端

    在本文中,我们将深入探讨SuperSocket的核心概念、功能特性,以及如何利用提供的客户端和服务器端示例源码进行开发。 首先,SuperSocket提供了一个简单而强大的API,允许开发者快速构建基于TCP/IP的服务器应用程序...

    C#应用socket示例

    Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ``` 4. 绑定本地端口: 使用`Bind()`方法将Socket与本地IP地址和端口号关联,以便接收数据: ```csharp ...

    LinuxSocket示例代码

    在IT行业中,Linux Socket是进行网络通信的重要工具,尤其对于系统和网络程序员来说,理解和掌握Linux Socket编程至关重要。本示例代码提供了客户端(client)和服务器端(server)的实现,帮助初学者深入理解如何在...

    vb.net中socket示例源代码.rar

    总之,VB.NET中的Socket示例代码为我们展示了如何利用Socket类进行TCP网络通信,包括服务器端的监听、连接接受和数据交换,以及客户端的连接、数据发送和接收。理解这些基本操作对于进行网络编程至关重要。通过实际...

    c# Socket 示例 Udp

    **C# UDP Socket示例** 以下是一个简单的C# UDP客户端和服务端示例: ```csharp // 服务端 using System; using System.Net; using System.Net.Sockets; class UdpServer { static void Main() { // 创建Socket...

    Java异步socket示例

    Java异步socket示例代码

    socket示例代码

    本示例代码包括客户端和服务端两部分,旨在展示如何通过Java的Socket API进行基本的通信。 在Java中,`java.net.Socket`类代表一个客户端Socket,用来连接到服务器的特定端口。`java.net.ServerSocket`类则用于...

    QT下多线程 UDP socket示例

    QT下多线程UDP Socket示例是一个典型的网络通信编程应用场景,它涉及到QT库中的网络模块,特别是关于UDP(用户数据报协议)的使用以及多线程技术。在本示例中,开发者创建了一个UDP服务器,该服务器能够在不影响主...

    c#Socket示例

    本示例“c#Socket示例”旨在帮助开发者理解和实践如何在C#中使用Socket进行异步通信。 首先,我们要理解Socket的工作原理。Socket是基于TCP/IP协议栈的,它为进程间的通信提供了端点。在C#中,我们可以使用`System...

    C# Socket 示例 Tcp

    本示例将详细讲解如何使用C#的Socket类进行TCP通信。 TCP(Transmission Control Protocol)是一种面向连接、可靠的传输协议,它通过三次握手建立连接,并确保数据的有序、无损传输。C#中的Socket类提供了TCP通信所...

    php socket示例

    总结来说,PHP Socket示例展示了如何在PHP中构建基于TCP/IP的服务器和客户端应用。服务端负责监听和响应客户端的请求,而客户端则用于发起连接并进行数据交换。在实际项目中,Socket通信常用于实时数据交互、聊天室...

    socket示例.rar

    本示例中,我们有两个文件:`SocketServer.java`和`SocketClient.java`,分别代表服务器端和客户端的实现。下面将详细介绍这两个文件可能包含的Java Socket编程知识点。 1. **Socket接口与ServerSocket类** - `...

    JAVA socket示例程序

    - 针对"NetCommunication"这个文件,可能包含了一个简单的Java Socket通信示例,包括客户端和服务器端的代码。分析这些代码可以帮助理解如何在实际项目中应用Socket通信。 总的来说,Java Socket编程是网络编程的...

    C# Socket示例.rar

    Socket编程在C#中是一种常见的网络通信方式,它允许应用程序通过网络发送和接收数据。C#的Socket类库提供了一套完整的接口,用于实现TCP(传输控制协议)和UDP(用户数据报协议)等网络通信协议。下面我们将深入探讨...

    简单的Socket示例

    这里个解决方案里有几个工程,分别介绍了socket中tcp、udp的简单应用,可以方便查找代码

    SuperSocket 示例 包含一个测试exe 以及相关dll

    本篇文章将深入探讨SuperSocket的核心组件、功能特性以及如何通过示例应用进行实践操作。 一、SuperSocket概述 SuperSocket是一个轻量级、高度可扩展的C#套接字服务器开发框架,适用于多种类型的网络应用程序,如...

    VC套接字socket示例(带接收出错SOCKET_ERROR重启机制)

    在VC++环境中,套接字(Socket)是网络编程中的基本元素,用于实现进程间的通信。这个示例展示了如何在Windows环境下使用Visual C++(VC)进行基于套接字的网络通信,特别是在处理错误时,如何实现一个带有接收错误...

Global site tag (gtag.js) - Google Analytics