200socket只能接收一次请求,不知道为什么,急

J2EE 码拜 9年前 (2016-03-20) 1156次浏览
从网上 扒下来一个socket服务端的代码,但是很神奇只能接收一次请求,业务什么的本人已经处理了,不想再去扒代码了,高手们,谁给看看这段代码怎么改,能一直接收请求200socket只能接收一次请求,不知道为什么,急

package socket;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/*
* 简单的socket服务端,实现和客户端的数据交换
*/
public class sockerServer {
	public static final int PORT = 9999;//端口
	public static void start() throws IOException {
		// 建立服务监听
		ServerSocket serverSocket = new ServerSocket(PORT);
		Socket s = serverSocket.accept();
		String serverMessage = "<?xml version="1.0" encoding="UTF-8" ?><ebank><id>990009999</id><name>北京联创智融</name><nameLoad>2012</nameLoad></ebank>";
		//服务端吧输入放到前面,输出放到后面
		//接收客户端的信息
		DataInputStream dis = new DataInputStream(new BufferedInputStream(s
				.getInputStream()));
		String readUTF = dis.readUTF();
		System.out.println("服务端打印===>>>>>>" + readUTF);
		SAXReader reader = new SAXReader();  
        Document doc;   
        try {
			doc = DocumentHelper.parseText(readUTF.substring(38,readUTF.length()));
       //Document doc = reader.read(ffile); //读取一个xml的文件  
       Element root = doc.getRootElement();  
       /*Attribute testCmd= root.attribute("ebank");  
       System.out.println(testCmd.getName()+"-***--"+testCmd.getValue());                   */      
       Element eName = root.element("id");  
       System.out.println("节点内容*--"+eName.getTextTrim());  
        } catch (DocumentException e) {
        	// TODO Auto-generated catch block
        	e.printStackTrace();
        }   
		//向客户端发送信息
		DataOutputStream ps = new DataOutputStream(s.getOutputStream());
		ps.writeUTF(serverMessage);
		ps.flush();//一定要写,负责客户端会进入等待状态
		dis.close();
		ps.close();
		//s.close();//这行 加与不加都是 只能接收一次
	}
	public static void main(String[] arge) throws UnknownHostException,
			IOException {
		sockerServer.start();
	}
}
解决方案

10

你找的代码就只能接收一次请求,不是一个真正的socket服务器程序

20

给你找个netty的例子
http://blog.csdn.net/lyq19870515/article/details/8004123
假如客户端一连接,就发消息,本人重写  channelConnected
假如客户端发消息,再反馈,重写 messageReceived

20

引用:
Quote: 引用:

你用的代码太烂 实在没法改
https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example/telnet
TelnetServer.java  不用改,修改端口不算
TelnetServerInitializer.java  不用改
TelnetServerHandler.java
你只需要修改这个方法,本人帮你简化为如下3行,request为输入,response为输出,都是字符串

@Override
	public void channelRead0(ChannelHandlerContext ctx, String request) throws Exception {
		String response = null;
		ChannelFuture future = ctx.write(response);
		future.addListener(ChannelFutureListener.CLOSE);
	}

其实吧,本人也知道再从网上找一个 就可以,但是这个为什么能接收一次,本人主要想问的是这个不是再找一个新的200socket只能接收一次请求,不知道为什么,急

一个socket服务,至少要有一个主线程,完成端口监听;还要一个多线程消息处理对象,主监听程序收到客户端连接后,创建一个消息处理对象,处理客户端连接上以后消息处理;你就一个主程序,处理一次消息后就退出了,当然就就只能收到一次消息。
while(ture){
accept();
new 消息处理对象;
消息处理对象-》设置参数   //输入信息传递
消息处理对象.start();   //线程启动
}

150

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

只能接收一次,是什么情况,服务停了?

对,就是接受一次服务就停了200socket只能接收一次请求,不知道为什么,急

客户端代码,本人跑一下试试200socket只能接收一次请求,不知道为什么,急

大哥,你跑没跑啊,怎么没消息了200socket只能接收一次请求,不知道为什么,急

哈哈,下边的亲测可用,你的是少了循环,参照着加上就行

//服务器
public static final int PORT = 9999;//端口
	    public static void main(String[] arge) {
	    	ServerSocket s = null;
			Socket socket = null;
			BufferedReader br = null;
			PrintWriter pw = null;
			try {
				//设定服务端的端口号
				s = new ServerSocket(PORT);
				System.out.println("ServerSocket Start:"+s);
				//等待请求,此方法会一直阻塞,直到获得请求才往下走
				socket = s.accept();
				System.out.println("Connection accept socket:"+socket);
				//用于接收客户端发来的请求
				br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				//用于发送返回信息,可以不需要装饰这么多io流使用缓冲流时发送数据要注意调用.flush()方法
				pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
				while(true){
					String str = br.readLine();
					if(str.equals("END")){
						break;
					}
					System.out.println("Client Socket Message:"+str);
					Thread.sleep(1000);
					pw.println("Message Received");
					pw.flush();
				}

			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				System.out.println("Close.....");
				try {
					br.close();
					pw.close();
					socket.close();
					s.close();
				} catch (Exception e2) {

				}
			}
//客户端
public static void main(String[] args){
		Socket socket = null;
		BufferedReader br = null;
		PrintWriter pw = null;
		try {
			//客户端socket指定服务器的地址和端口号
			socket = new Socket("127.0.0.1", PORT);
			System.out.println("Socket=" + socket);
			//同服务器原理一样
			br = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
					socket.getOutputStream())));
			for (int i = 0; i < 10; i++) {
				pw.println("howdy " + i);
				pw.flush();
				String str = br.readLine();
				System.out.println(str);
			}
			pw.println("END");
			pw.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				System.out.println("close......");
				br.close();
				pw.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明200socket只能接收一次请求,不知道为什么,急
喜欢 (0)
[1034331897@qq.com]
分享 (0)