先贴代码:
一、服务器端线程
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示例"是一个在NetBeans环境中开发的简单聊天工具,它利用了Socket来实现实时的客户端-服务器通信。下面我们将深入探讨Java Socket的基本概念、工作原理以及如何在实际应用中创建一个简单的...
在本文中,我们将深入探讨SuperSocket的核心概念、功能特性,以及如何利用提供的客户端和服务器端示例源码进行开发。 首先,SuperSocket提供了一个简单而强大的API,允许开发者快速构建基于TCP/IP的服务器应用程序...
Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ``` 4. 绑定本地端口: 使用`Bind()`方法将Socket与本地IP地址和端口号关联,以便接收数据: ```csharp ...
在IT行业中,Linux Socket是进行网络通信的重要工具,尤其对于系统和网络程序员来说,理解和掌握Linux Socket编程至关重要。本示例代码提供了客户端(client)和服务器端(server)的实现,帮助初学者深入理解如何在...
总之,VB.NET中的Socket示例代码为我们展示了如何利用Socket类进行TCP网络通信,包括服务器端的监听、连接接受和数据交换,以及客户端的连接、数据发送和接收。理解这些基本操作对于进行网络编程至关重要。通过实际...
**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 API进行基本的通信。 在Java中,`java.net.Socket`类代表一个客户端Socket,用来连接到服务器的特定端口。`java.net.ServerSocket`类则用于...
QT下多线程UDP Socket示例是一个典型的网络通信编程应用场景,它涉及到QT库中的网络模块,特别是关于UDP(用户数据报协议)的使用以及多线程技术。在本示例中,开发者创建了一个UDP服务器,该服务器能够在不影响主...
本示例“c#Socket示例”旨在帮助开发者理解和实践如何在C#中使用Socket进行异步通信。 首先,我们要理解Socket的工作原理。Socket是基于TCP/IP协议栈的,它为进程间的通信提供了端点。在C#中,我们可以使用`System...
本示例将详细讲解如何使用C#的Socket类进行TCP通信。 TCP(Transmission Control Protocol)是一种面向连接、可靠的传输协议,它通过三次握手建立连接,并确保数据的有序、无损传输。C#中的Socket类提供了TCP通信所...
总结来说,PHP Socket示例展示了如何在PHP中构建基于TCP/IP的服务器和客户端应用。服务端负责监听和响应客户端的请求,而客户端则用于发起连接并进行数据交换。在实际项目中,Socket通信常用于实时数据交互、聊天室...
本示例中,我们有两个文件:`SocketServer.java`和`SocketClient.java`,分别代表服务器端和客户端的实现。下面将详细介绍这两个文件可能包含的Java Socket编程知识点。 1. **Socket接口与ServerSocket类** - `...
- 针对"NetCommunication"这个文件,可能包含了一个简单的Java Socket通信示例,包括客户端和服务器端的代码。分析这些代码可以帮助理解如何在实际项目中应用Socket通信。 总的来说,Java Socket编程是网络编程的...
Socket编程在C#中是一种常见的网络通信方式,它允许应用程序通过网络发送和接收数据。C#的Socket类库提供了一套完整的接口,用于实现TCP(传输控制协议)和UDP(用户数据报协议)等网络通信协议。下面我们将深入探讨...
这里个解决方案里有几个工程,分别介绍了socket中tcp、udp的简单应用,可以方便查找代码
本篇文章将深入探讨SuperSocket的核心组件、功能特性以及如何通过示例应用进行实践操作。 一、SuperSocket概述 SuperSocket是一个轻量级、高度可扩展的C#套接字服务器开发框架,适用于多种类型的网络应用程序,如...
在VC++环境中,套接字(Socket)是网络编程中的基本元素,用于实现进程间的通信。这个示例展示了如何在Windows环境下使用Visual C++(VC)进行基于套接字的网络通信,特别是在处理错误时,如何实现一个带有接收错误...