-
为什么我第二次输入内容发送到服务器,服务器却不能收到?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个答案 按时间排序 按投票排序
-
采纳的答案
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
-
引用
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
相关推荐
TCP协议根据首部校验和判断数据有效性,最终可以给发送端主机以TCP确认响应(TCP三次握手的第二次),再经历上述过程。 HTTPS/HTTP请求HTTPS比HTTP在正式第一次请求之前,要多一个建立SSL安全隧道的过程,保证HTTP...
2. **第二次握手**:服务器收到SYN包后,发送一个ACK包作为确认,并且同时发送自己的SYN包给客户端,此时服务器的状态变为SYN_RCVD。 3. **第三次握手**:客户端收到服务器的SYN+ACK包后,再次发送一个ACK包确认,...
如果本机已绑定了多个IP地址,想利用不同的IP地址得出不同的Web页面,则只需在“默认Web站点”处单击右键,选“新建→站点”,然后根据提示在“说明”处输入任意用于说明它的内容(比如为“我的第二个Web站点”)、...
服务器接收到请求后,比较输入的验证码与发送的验证码是否一致,从而确认用户身份。 8. **错误处理和反馈**:在整个过程中,无论是前端还是后端,都需要对可能出现的错误进行处理,如网络错误、格式错误、验证码...
第二次握手,服务器收到客户端的SYN报文后,发送一个带有SYN和ACK标志位的报文段,对客户端的SYN报文进行确认,并同时发送自己的SYN请求,随后服务器进入SYN_RECV状态;第三次握手,客户端收到服务器的SYN+ACK报文后...
2. 第二次握手:服务器接收到SYN包后,回复一个SYN+ACK(同步序列编号+确认)的数据包,确认客户端的序列号,并且服务器也会发送自己的ISN给客户端。 3. 第三次握手:客户端收到服务器的SYN+ACK包后,再次发送一个...
2. 第二次握手:服务器收到客户端的SYN包后,回应一个SYN+ACK(同步序列编号+确认)包给客户端,自身进入SYN_RECV状态。 3. 第三次握手:客户端收到服务器的SYN+ACK包后,再发送一个ACK(确认)包给服务器,至此,...
2. 第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。 3. 第三次握手:客户端收到服务器的 SYN+ACK 包,向...
第二次的标志是“[SYN, ACK]”,序列号 Seq 为 0,Ack 值为客户端发送过来的 Seq 加 1,也就是 1,表示服务器可以正常接收客户端数据包。第三次的标志是“[ACK]”,客户端表示可以正常接收服务器数据包,这是为了保证...
用户在手机上输入验证码后,前端将输入提交到服务器。服务器接收到验证码,与之前存储的验证码进行对比,如果一致则验证通过,否则失败。 5. **超时与重试机制**: 验证码通常设置有效时间,过期后无效。同时,应...
2. **第二次挥手**:服务器收到FIN包后,会发送一个ACK确认包。 3. **第三次挥手**:一段时间后,服务器没有要向客户端发送的数据了也会发送一个FIN包来表示同意关闭连接。 4. **第四次挥手**:客户端收到FIN包后,...
- 第二次握手:服务器收到SYN包后,回复一个SYN+ACK(同步+确认)包,确认号为客户端ISN+1,同时服务器也发送自己的ISN作为序列号。 - 第三次握手:客户端接收到服务器的回复后,再次发送一个ACK包,确认号为...
在Web开发中,通常会结合前端和后端技术来实现这一功能。以下将详细讲解这个过程,包括前后端交互、Java后端实现...在实际应用中,还需要根据项目需求进行优化和调整,比如增加二次验证、语音验证等增强安全性的措施。
客户端收到服务器的回复后,再发送一个确认包,确认号 Ack 设置为 Y+1,同时自己的序号 Seq 设置为 X+1,这是第二次握手。服务器收到这个确认包后,连接正式建立,此时双方都进入了 ESTABLISHED 状态,可以开始数据...
第二次挥手:服务器收到命令后,给客户端回复(ACK)收到指令里的随机值+1,由于TCP是安全可靠的,现在不会直接断开连接,而是等数据处理完之后,这时客户端关闭发送功能,保留接收功能。 第三次挥手:服务器处理完...
- 第二次握手:服务器接收到SYN后,回应一个SYN+ACK报文段,确认连接请求,并分配资源。 - 第三次握手:客户端收到服务器的确认后,再发送一个ACK(确认)报文段,正式建立连接。 2. **TCP数据传输** - TCP将...
网络中的DHCP服务器收到发现消息后,会回应一个DHCP提供消息,提供一个IP地址。然后,设备会发送一个DHCP请求消息,确认它接受这个IP地址。最后,服务器发送一个确认消息,完成地址分配。 在本小测试的实践环节,将...
- **第二次握手**:服务器接收到客户端的SYN数据包后,会发送一个带有SYN和ACK标志的数据包作为回应,表示接受建立连接,并进入SYN_RECV状态。 - **第三次握手**:客户端接收到服务器的SYN+ACK数据包后,再发送一个...
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送...
2. **第二次握手**:服务器接收到SYN报文后,回应一个SYN+ACK(Acknowledgement)报文,确认接收并准备建立连接。 3. **第三次握手**:客户端收到服务器的SYN+ACK报文后,发送ACK报文,确认连接建立完成。 ### 3. ...