从网上 扒下来一个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();
}
}
}