java中客户端用socket连接上服务端之后一直没有断开,不定时给服务端发送数据,服务器端如何知道?
答案:3 悬赏:0 手机版
解决时间 2021-11-28 16:05
- 提问者网友:谁的错
- 2021-11-28 03:49
java中客户端用socket连接上服务端之后一直没有断开,不定时给服务端发送数据,服务器端如何知道?
最佳答案
- 五星知识达人网友:过活
- 2021-11-28 03:58
public void start() throws IOException{
ServerSocket ss = new ServerSocket(9000);
while(true){
Socket s = ss.accept();
}
}
要用到线程的东西追问我服务器端就是这么写的,现在客户端一直连着我的服务器,并且不定时给服务器发送数据,但是我服务器如何能知道他又给我发送数据了呢?用socket只有在客户端刚访问服务器端的时候能监听到,之后就监听不到了追答public void start() throws IOException{
ServerSocket ss = new ServerSocket(9000);
while(true){
Socket s = ss.accept();
new Agent(s).start();
}
}
class Agent extends Thread{
Socket s;
public Agent(Socket s) {
this.s = s;
}
public void run() {
try{
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
//向客户端发送, 先发生协议返回行,文本行
IOUtils.println(out, "text,1");//协议头
//发送消息内容, 一行文本消息
IOUtils.println(out, "欢迎使用FTP演示服务器!");
while(true){
//读取客户端发送到命令
String cmd = IOUtils.readLine(in).trim();
if("pwd".equals(cmd)){//显示当前目录
pwd(out);
}else if("ls".equals(cmd)){
ls(out);
}else if(cmd.startsWith("get ")){
get(cmd, out);
}else if("bye".equalsIgnoreCase(cmd)){
IOUtils.println(out, "text,1");
IOUtils.println(out, "Bye, Bye!");
s.close();
}else{
IOUtils.println(out, "text,1");
IOUtils.println(out, "只支持pwd,ls,get,bye!");
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
ServerSocket ss = new ServerSocket(9000);
while(true){
Socket s = ss.accept();
}
}
要用到线程的东西追问我服务器端就是这么写的,现在客户端一直连着我的服务器,并且不定时给服务器发送数据,但是我服务器如何能知道他又给我发送数据了呢?用socket只有在客户端刚访问服务器端的时候能监听到,之后就监听不到了追答public void start() throws IOException{
ServerSocket ss = new ServerSocket(9000);
while(true){
Socket s = ss.accept();
new Agent(s).start();
}
}
class Agent extends Thread{
Socket s;
public Agent(Socket s) {
this.s = s;
}
public void run() {
try{
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
//向客户端发送, 先发生协议返回行,文本行
IOUtils.println(out, "text,1");//协议头
//发送消息内容, 一行文本消息
IOUtils.println(out, "欢迎使用FTP演示服务器!");
while(true){
//读取客户端发送到命令
String cmd = IOUtils.readLine(in).trim();
if("pwd".equals(cmd)){//显示当前目录
pwd(out);
}else if("ls".equals(cmd)){
ls(out);
}else if(cmd.startsWith("get ")){
get(cmd, out);
}else if("bye".equalsIgnoreCase(cmd)){
IOUtils.println(out, "text,1");
IOUtils.println(out, "Bye, Bye!");
s.close();
}else{
IOUtils.println(out, "text,1");
IOUtils.println(out, "只支持pwd,ls,get,bye!");
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
全部回答
- 1楼网友:山河有幸埋战骨
- 2021-11-28 05:39
单独的读线程,有数据即时读出来
- 2楼网友:逃夭
- 2021-11-28 04:28
如果是一对一的话,不要用到线程,相当于一个1对1的聊天。主要是这,你看下
try{t.setText("服务端开启,等待客户端连接");
ss=new ServerSocket(50000);
}catch(IOException e){
System.err.println("无法在50000端口建立监听服务");
System.exit(1);
}
try{ s=ss.accept();
fstart=true;
t.append("\n和来自"+s.getInetAddress()+"客户端连接成功!\n");
t.append("\n你现在可以通信了");
dis=new DataInputStream(s.getInputStream());
kehu[1]=dis.readUTF();
}catch(IOException e){
System.err.println("和客户端建立服务失败");
System.exit(1);
}
try{
while(true){
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
t.append("\n客户端1:"+dis.readUTF());
}
}catch(IOException e){
}
}
try{t.setText("服务端开启,等待客户端连接");
ss=new ServerSocket(50000);
}catch(IOException e){
System.err.println("无法在50000端口建立监听服务");
System.exit(1);
}
try{ s=ss.accept();
fstart=true;
t.append("\n和来自"+s.getInetAddress()+"客户端连接成功!\n");
t.append("\n你现在可以通信了");
dis=new DataInputStream(s.getInputStream());
kehu[1]=dis.readUTF();
}catch(IOException e){
System.err.println("和客户端建立服务失败");
System.exit(1);
}
try{
while(true){
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
t.append("\n客户端1:"+dis.readUTF());
}
}catch(IOException e){
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯