从网上 扒下来一个socket服务端的代码,但是很神奇只能接收一次请求,业务什么的本人已经处理了,不想再去扒代码了,高手们,谁给看看这段代码怎么改,能一直接收请求
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
http://blog.csdn.net/lyq19870515/article/details/8004123
假如客户端一连接,就发消息,本人重写 channelConnected
假如客户端发消息,再反馈,重写 messageReceived
20
一个socket服务,至少要有一个主线程,完成端口监听;还要一个多线程消息处理对象,主监听程序收到客户端连接后,创建一个消息处理对象,处理客户端连接上以后消息处理;你就一个主程序,处理一次消息后就退出了,当然就就只能收到一次消息。
while(ture){
accept();
new 消息处理对象;
消息处理对象-》设置参数 //输入信息传递
消息处理对象.start(); //线程启动
}
150
只能接收一次,是什么情况,服务停了?
对,就是接受一次服务就停了
客户端代码,本人跑一下试试
大哥,你跑没跑啊,怎么没消息了
哈哈,下边的亲测可用,你的是少了循环,参照着加上就行
//服务器 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(); } } }