0 0

为什么我第二次输入内容发送到服务器,服务器却不能收到?10

源代码:
ChatServer.java
import java.io.DataInputStream;
import java.io.IOException;
import java.net.*;
public class ChatServer {

public static void main(String[] args) {

boolean  started = false;
   try {
ServerSocket ss = new ServerSocket(8888);
started = true;
while(true)
{
Socket s = new Socket();

s = ss.accept();
System.out.println("a client connected!!!");
DataInputStream dis = new DataInputStream (s.getInputStream());
String str = dis.readUTF();
System.out.println(str);
//dis.close();
}
} catch (IOException e) {

e.printStackTrace();
}
  
}

}
ChatClient.java
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
public class ChatClient extends Frame {
//成员变量
Socket s = null;
     TextField tfInput = new TextField();
     TextArea taDisplay = new TextArea();
     DataOutputStream dos = null;
public static void main(String[] args) {
new ChatClient().launchFrame();
}
//新建launchFrame方法建立窗口
private void launchFrame()
{
setLocation(400,300);
setSize(300,300);
tfInput.addActionListener(new InputListener());
add(tfInput,BorderLayout.SOUTH);
add(taDisplay,BorderLayout.NORTH);
addWindowListener(new WindowAdapter(){


public void windowClosing(WindowEvent e) {
     Disconnect();
         System.exit(0);
}

});
pack();
setVisible(true);
Connect();
}
//断开连接方法
public void Disconnect()
{
try {
dos.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
   //定义输入框监听器类
private class InputListener implements ActionListener
{

public void actionPerformed(ActionEvent e) {
             String str = null;
             str = tfInput.getText();
             taDisplay.append(str+"\n");
             tfInput.setText("");
             try {
dos.writeUTF(str);
dos.flush();
//dos.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

}
//单独建立一个方法,用于连接到服务器
private void Connect()
{
try {
s = new Socket ("127.0.0.1",8888);
dos = new DataOutputStream(s.getOutputStream());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}

 
2013年3月12日 22:31

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

0 0

采纳的答案

while(true)
{
Socket s = new Socket();

s = ss.accept();
System.out.println("a client connected!!!");
DataInputStream dis = new DataInputStream (s.getInputStream());
String str = dis.readUTF();
System.out.println(str);
} 

服务端ss.accept每次接收都是一个新的socket客户端连接, 但是你客户端只创建了一次连接, 所以第二次自然就接收不到, 如果你只是为了做单线程的处理的话, 代码这样改就行了.
Socket s = new Socket();
s = ss.accept();
System.out.println("a client connected!!!");
DataInputStream dis = new DataInputStream (s.getInputStream());
while(true)
{
String str = dis.readUTF();
System.out.println(str);
} 

2013年3月13日 10:43
0 0

引用
while(true) 
{ 

Socket s = new Socket(); 

s = ss.accept(); 
System.out.println("a client connected!!!"); 
DataInputStream dis = new DataInputStream (s.getInputStream()); 
String str = dis.readUTF(); 
System.out.println(str); 
//dis.close(); 
} 
} catch (IOException e) { 

e.printStackTrace(); 
} 

连接没有保持,丢失了。
如果你要多线程例子,我这边有一个:
http://bbjava.iteye.com/blog/1122006

2013年3月13日 14:32

相关推荐

    输入URL后会发生什么1

    TCP协议根据首部校验和判断数据有效性,最终可以给发送端主机以TCP确认响应(TCP三次握手的第二次),再经历上述过程。 HTTPS/HTTP请求HTTPS比HTTP在正式第一次请求之前,要多一个建立SSL安全隧道的过程,保证HTTP...

    深度解析浏览器中输入URL后发生了什么

    2. **第二次握手**:服务器收到SYN包后,发送一个ACK包作为确认,并且同时发送自己的SYN包给客户端,此时服务器的状态变为SYN_RCVD。 3. **第三次握手**:客户端收到服务器的SYN+ACK包后,再次发送一个ACK包确认,...

    IIS6.0 IIS,互联网信息服务

    如果本机已绑定了多个IP地址,想利用不同的IP地址得出不同的Web页面,则只需在“默认Web站点”处单击右键,选“新建→站点”,然后根据提示在“说明”处输入任意用于说明它的内容(比如为“我的第二个Web站点”)、...

    手机发送验证码和前台页面相关的样式.rar

    服务器接收到请求后,比较输入的验证码与发送的验证码是否一致,从而确认用户身份。 8. **错误处理和反馈**:在整个过程中,无论是前端还是后端,都需要对可能出现的错误进行处理,如网络错误、格式错误、验证码...

    计算机网络面试问题.pdf

    第二次握手,服务器收到客户端的SYN报文后,发送一个带有SYN和ACK标志位的报文段,对客户端的SYN报文进行确认,并同时发送自己的SYN请求,随后服务器进入SYN_RECV状态;第三次握手,客户端收到服务器的SYN+ACK报文后...

    计算机网络经典问题.pdf

    2. 第二次握手:服务器接收到SYN包后,回复一个SYN+ACK(同步序列编号+确认)的数据包,确认客户端的序列号,并且服务器也会发送自己的ISN给客户端。 3. 第三次握手:客户端收到服务器的SYN+ACK包后,再次发送一个...

    面向字节_计算机网络.pdf

    2. 第二次握手:服务器收到客户端的SYN包后,回应一个SYN+ACK(同步序列编号+确认)包给客户端,自身进入SYN_RECV状态。 3. 第三次握手:客户端收到服务器的SYN+ACK包后,再发送一个ACK(确认)包给服务器,至此,...

    TCP-IP协议抓包分析实验报告.docx

    2. 第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。 3. 第三次握手:客户端收到服务器的 SYN+ACK 包,向...

    Wireshark抓包分析TCP“三次握手,四次挥手”.doc

    第二次的标志是“[SYN, ACK]”,序列号 Seq 为 0,Ack 值为客户端发送过来的 Seq 加 1,也就是 1,表示服务器可以正常接收客户端数据包。第三次的标志是“[ACK]”,客户端表示可以正常接收服务器数据包,这是为了保证...

    java,C#,PHP等实现手机发送验证码Demo

    用户在手机上输入验证码后,前端将输入提交到服务器。服务器接收到验证码,与之前存储的验证码进行对比,如果一致则验证通过,否则失败。 5. **超时与重试机制**: 验证码通常设置有效时间,过期后无效。同时,应...

    baguwen 6666666

    2. **第二次挥手**:服务器收到FIN包后,会发送一个ACK确认包。 3. **第三次挥手**:一段时间后,服务器没有要向客户端发送的数据了也会发送一个FIN包来表示同意关闭连接。 4. **第四次挥手**:客户端收到FIN包后,...

    Wireshark数据抓包分析之传输层协议(TCP协议)

    - 第二次握手:服务器收到SYN包后,回复一个SYN+ACK(同步+确认)包,确认号为客户端ISN+1,同时服务器也发送自己的ISN作为序列号。 - 第三次握手:客户端接收到服务器的回复后,再次发送一个ACK包,确认号为...

    java短信验证(前后台全部)

    在Web开发中,通常会结合前端和后端技术来实现这一功能。以下将详细讲解这个过程,包括前后端交互、Java后端实现...在实际应用中,还需要根据项目需求进行优化和调整,比如增加二次验证、语音验证等增强安全性的措施。

    计算机网络课程设计报告.doc

    客户端收到服务器的回复后,再发送一个确认包,确认号 Ack 设置为 Y+1,同时自己的序号 Seq 设置为 X+1,这是第二次握手。服务器收到这个确认包后,连接正式建立,此时双方都进入了 ESTABLISHED 状态,可以开始数据...

    面试题1(带答案)_嵌入式-常用知识&面试题库_大厂面试真题.pdf

    第二次挥手:服务器收到命令后,给客户端回复(ACK)收到指令里的随机值+1,由于TCP是安全可靠的,现在不会直接断开连接,而是等数据处理完之后,这时客户端关闭发送功能,保留接收功能。 第三次挥手:服务器处理完...

    TCP.rar_TCP 聊天_VC++ 聊天程序_tcp实现聊天c++

    - 第二次握手:服务器接收到SYN后,回应一个SYN+ACK报文段,确认连接请求,并分配资源。 - 第三次握手:客户端收到服务器的确认后,再发送一个ACK(确认)报文段,正式建立连接。 2. **TCP数据传输** - TCP将...

    HCIA第二次作业:DHCP和添加静态路由的小测试

    网络中的DHCP服务器收到发现消息后,会回应一个DHCP提供消息,提供一个IP地址。然后,设备会发送一个DHCP请求消息,确认它接受这个IP地址。最后,服务器发送一个确认消息,完成地址分配。 在本小测试的实践环节,将...

    计算机网络-面试专题及答案

    - **第二次握手**:服务器接收到客户端的SYN数据包后,会发送一个带有SYN和ACK标志的数据包作为回应,表示接受建立连接,并进入SYN_RECV状态。 - **第三次握手**:客户端接收到服务器的SYN+ACK数据包后,再发送一个...

    TCP,IP协议抓包分析实验报告.pdf

    第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送...

    HTTP GET请求中所涉及到的网络协议

    2. **第二次握手**:服务器接收到SYN报文后,回应一个SYN+ACK(Acknowledgement)报文,确认接收并准备建立连接。 3. **第三次握手**:客户端收到服务器的SYN+ACK报文后,发送ACK报文,确认连接建立完成。 ### 3. ...

Global site tag (gtag.js) - Google Analytics