0 0

这段java-socket服务端程序是否稳定?有哪里可以改进?0

面对socket客户端每分钟发送一次信息,这段java-socket服务端程序是否稳定?有哪里可以改进?
package test;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ServeSocket{
	//private static Logger logger = Logger.getLogger(ServeSocket.class);

	private Socket socket;
	private ServerSocket serverSocket;
	//端口
	private int socketPort = 10000;
	//队列长度
	private int queueLength = 10;
	//IP地址
	private String socketAddress = "127.0.0.1";
	private ExecutorService executeService = Executors.newFixedThreadPool(10);
	
	private BufferedReader br;
	private FileOutputStream fos;
	private OutputStreamWriter out;
	
	public void serveSocketProgram(){
		try {
			serverSocket = new ServerSocket(socketPort,queueLength,InetAddress.getByName(socketAddress));
			while(true){
				socket = serverSocket.accept();
				executeService.submit(new Runnable() {
					public void run() {
						try {
							br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
							while(br.read()!=-1){
								String message = br.readLine();
								System.out.println(message);
							}
						} catch (IOException e) {
							e.printStackTrace();
						} finally{
							try {
								br.close();
								socket.close();
							} catch (IOException e) {
								e.printStackTrace();
							}
						}
					}
				});
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		new ServeSocket().serveSocketProgram();
	}

}
2013年7月19日 15:32

6个答案 按时间排序 按投票排序

0 0

采纳的答案

有几个问题
1、你的IP绑定了127.0.0.1,只能接受本机发来的请求。建议为0.0.0.0,绑定所有网卡
2、每读一次readLine,都会丢弃一个字节,因为你用read!=-1判断。建议通过do while的模型判断readLine是否返回的为null
3、使用readLine在网络编程中不是好习惯,因为这要求对方必须发送换行符过来,如果没有你就一直等待直至超时。所以建议双方协商好协议,通过传输一个header,通过一个int标识body部分有多少个字节,然后直接创建相同大小的数组获取传输的流的信息
4、文字编码格式和字节序。如果传输的是文本,是UTF-8格式吗?双方要商定好。如果有int、long等类型,那就需要考虑字节序了。java传输的是标准的网络字节序
5、BufferedReader应该是局部变量,否则会出问题的。
5、每收到一行就println,这样会导致多个线程的时候输出的内容混乱。建议内容先存放到一个StringBuilder中(局部变量),然后一次性的打印出来。
还有一些改进意见
1、是否考虑改为nio,如果只是传输一些消息,目前的bio效率很低。
2、客户端一分钟发送一次,那么有多少个客户端会同时发过来呢?并发的问题的考虑。
3、建议考虑一个服务的退出机制,首先建议使用一个单独的用户线程来做这个消息的循环,同时设定一个标志位,遇到false就退出。避免使用while(true),另外要响应一些中断异常等,这些就不多说了java并发里面说的很清楚。
有什么问题直接私信问我吧

2013年7月22日 09:10
0 0

建议在处理socket stream的时候,直接按字节读,之后对字节不是按换行符读取,你可以做一个编码协议层,将来要更换协议也更方便。
另外,socket本身也可以加上超时soTimeout,防止长时间阻塞一直占有线程。

2013年7月22日 15:17
0 0

首先不应该在死循环中放入线程,会造成线程混乱。应该在线程中启用循环去连接。

2013年7月22日 10:43
0 0

while(br.read()!=-1){ 
                                String message = br.readLine(); 
                                System.out.println(message); 
                            }

br.read和br.readLine,这两者重复了,br.read返回的东西直接被你丢弃了。你这样会造成客户端发送东西很不方便。

2013年7月20日 21:58
0 0

1 多个线程绑定同一IP、端口是不行的:
别用多线程

2 多个线程共享一个socket是不行的:
把socket定义写到while里面

2013年7月20日 14:14
0 0

有,有个线程安全的问题

你的BufferedReader应该只关联一个socket的

而不是所有的socket都关联一个BufferedReader

这样会引起你的消息混乱

2013年7月19日 16:48

相关推荐

    tcp.rar_java socket 服务端_java tcp socket_服务端 客户端

    一旦有客户端连接,服务器端会创建一个`java.net.Socket`对象来处理这个连接。在本例中,服务器端可能会包含以下步骤: 1. 创建`ServerSocket`对象,指定监听的端口。 2. 使用`accept()`方法阻塞等待客户端连接。 3...

    基于Java--Socket-网络编程.doc

    ### 基于Java Socket网络编程的关键知识点 #### 一、网络基础——TCP/IP协议 ...通过上述知识点的学习,我们可以深入理解Java Socket网络编程的基本原理和技术细节,这对于开发复杂的网络应用程序至关重要。

    socket服务端_socket_

    "socket服务端_socket_"这个标题暗示了我们将探讨一个关于Socket服务端的示例程序,可能是用某种编程语言实现的,比如Python、Java或C++。 首先,让我们了解Socket的基本概念。Socket是操作系统提供的接口,允许...

    socket传输文件服务端代码Java实现

    本篇文章将深入探讨如何使用Java的Socket API实现文件传输服务端代码,尤其针对Windows平台下的操作进行详细讲解。 首先,让我们理解Socket的基本概念。Socket是网络通信中的一个端点,它允许两个应用程序通过网络...

    Java中实现服务端和客户端传输文件

    在Java编程环境中,服务端和客户端之间的文件传输...通过阅读和理解这段代码,你可以掌握如何在实际项目中使用Java进行文件传输。注意,为了保证传输的安全性,实际应用中可能还需要考虑加密传输、身份验证等安全措施。

    ios push java 服务端程序

    本文将深入探讨如何使用Java在服务端构建一个与APNs交互的程序,以便向iOS设备发送推送通知。 一、Apple Push Notification Service (APNs) APNs是苹果公司提供的一个服务,允许应用程序在后台向用户发送通知,即使...

    Socket服务端实战

    Socket服务端实战主要涉及到网络编程的核心概念,尤其是TCP/IP协议栈中的应用层部分。Socket是计算机网络中进程间通信的一种方式,它允许不同设备上的应用程序通过网络交换数据。本实战项目将教你如何创建一个能够...

    java聊天室服务端代码

    总之,Java聊天室服务端代码是一个涵盖网络编程、多线程、数据交换等多个领域的项目,对于学习和提升Java编程技能非常有帮助。继续完善这个项目将涉及到更多的细节优化和功能实现,如用户认证、聊天记录存储、群聊...

    Java_Socket通讯源代码

    对于开发者来说,理解并掌握Socket编程是构建网络应用程序的基础,通过这个经典的Java_Socket源代码示例,可以深入理解网络通信的底层原理,提高网络编程能力。 在学习这个示例时,你需要关注以下几个关键点: 1. ...

    socket聊天程序java源代码

    通过以上分析可以看出,这个简单的Socket聊天程序实现了基本的客户端和服务端间的文本消息传递功能。它利用了Java中的多线程机制和Socket编程技术,使得客户端可以同时发送和接收消息。虽然该程序较为基础,但它是...

    java socket

    在Java中,Socket是基于TCP(传输控制协议)的,为应用程序提供了一种可靠的、双向的通信方式。通过Socket,我们可以构建客户端和服务器端的通信系统,实现数据的双向传输。 在Java Socket编程中,有两个主要的角色...

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

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java socket长连接客户端服务端(标准实例)

    在提供的压缩文件`socket长连接客户端服务端_1600003815`中,可能包含了完整的Java代码示例,你可以通过阅读和运行这些代码来深入理解Java Socket长连接的工作原理。这个实例应该包括客户端和服务端的类,以及如何...

    TCP通讯 服务端程序

    在实际编程中,常用的语言如C++、Java或Python都有相应的库支持TCP服务端编程,如C++的socket库、Java的ServerSocket类和Python的socketserver模块。开发者可以根据需求选择合适的技术栈。 服务端程序还涉及到错误...

    java实现客户端与服务端通信

    总的来说,这段代码展示了如何使用Java的`Socket`、`DataInputStream`和`DataOutputStream`进行客户端与服务端的简单通信,同时结合了多线程和事件监听等技术,创建了一个简单的聊天应用示例。这个应用允许用户输入...

    Socket客户端服务端

    在这个主题中,我们将深入探讨Socket在客户端和服务端的角色以及如何实现它们之间的通信。 首先,让我们了解Socket的基本概念。Socket,又称为套接字,是网络编程中进程间通信的一种方式,它允许不同主机上的进程...

    \\(^_^)/ Java 使用Socket多线程传输整个文件夹

    最后,提供的"FileUpload"可能是服务器端或客户端的代码示例,通过阅读和理解这段代码,我们可以更深入地学习到如何实现上述功能。总的来说,使用Java的Socket和多线程技术实现文件夹传输是一项复杂的任务,需要掌握...

    基于java的Tcp服务端与客户端的JAVA实例源代码.zip

    这段代码创建了一个服务器,它监听6666端口,当有客户端连接时,会创建一个新的线程来处理客户端的请求。服务端读取客户端发送的数据并回显。 接下来是TCP客户端的示例: ```java import java.io.*; import java...

    安卓app之间的socket通信,支持多线程

    - 当有新的客户端连接时,通过ServerSocket的accept()方法获取Socket对象,然后可以通过这个Socket对象与客户端进行通信。 2. **多线程处理** - 由于Socket通信可能会同时处理多个客户端,因此我们需要在每个...

    卫通星GPS定位器GT06协议socket通讯JAVA Spring Boot对接

    本文将详细讨论如何使用卫通星GPS定位器GT06的通信协议,通过Socket进行数据传输,并结合Java与Spring Boot框架实现后台服务的对接。 卫通星GPS定位器GT06是一款基于GSM网络的车载定位设备,它能够实时发送位置、...

Global site tag (gtag.js) - Google Analytics