该服务器的行为类似于回显服务器。客户端向服务器发送10个数据包(间隔为1秒)
当客户端从服务器接收数据包时,有时数据包会丢失。
因此,客户端必须等待一秒钟,直到数据包到达。如果数据包未在1秒钟内到达,则客户端应继续发送其他数据包。
我将如何使用.setSoTimeout实现此目的?
import java.io.*;
import java.net.*;
import java.util.*;
/*
* Client to process ping requests over UDP.
*/
public class PingClient
{
private static final int AVERAGE_DELAY = 100; // milliseconds
public static void main(String[] args) throws Exception
{
// Get command line argument.
int port = Integer.parseInt(args[1]);//specified as argument
// Create random number generator for use in simulating
// packet loss and network delay.
System.out.println("Port "+port);
// Create a datagram socket for receiving and sending UDP packets
// through the port specified on the command line.
DatagramSocket socket = new DatagramSocket(1234);
int i=0;
for(i=0;i<10;i++)
{
byte[] buf = new byte[1024] ;
Calendar cal=Calendar.getInstance();
String ping="Ping "+ i +" "+cal.getTimeInMillis()+"\r\n";
buf=ping.getBytes("UTF-8");
InetAddress address = InetAddress.getByName(args[0]);
System.out.println("Name "+args[1]);
DatagramPacket packet = new DatagramPacket(buf, buf.length,
address, port);
packet.setData(buf);
socket.send(packet);
Thread.sleep( 10* AVERAGE_DELAY);//1 sec
DatagramPacket server_response = new DatagramPacket(new byte[1024], 1024);
// Block until the host receives a UDP packet.
socket.setSoTimeout(1000); //I don't know how to use this
socket.receive(server_response);
// Print the recieved data.
printData(server_response);
}
}
private static void printData(DatagramPacket request) throws Exception
{
// Obtain references to the packet's array of bytes.
byte[] buf = request.getData();
// Wrap the bytes in a byte array input stream,
// so that you can read the data as a stream of bytes.
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
// Wrap the byte array output stream in an input stream reader,
// so you can read the data as a stream of characters.
InputStreamReader isr = new InputStreamReader(bais);
// Wrap the input stream reader in a bufferred reader,
// so you can read the character data a line at a time.
// (A line is a sequence of chars terminated by any combination of \r and \n.)
BufferedReader br = new BufferedReader(isr);
// The message data is contained in a single line, so read this line.
String line = br.readLine();
// Print host address and data received from it.
System.out.println(
"Received from " +
request.getAddress().getHostAddress() +
": " +
new String(line) );
}
}
setSoTimeout的Javadoc说:
将此选项设置为非零超时后,对此DatagramSocket的receive()的调用将仅在此时间量内阻塞。如果超时到期,则将引发java.net.SocketTimeoutException,尽管DatagramSocket仍然有效。
因此,如果要在1秒后未收到任何响应的情况下发送数据包,则只需使用
socket.setSoTimeout(1000L);
boolean continueSending = true;
int counter = 0;
while (continueSending && counter < 10) {
// send to server omitted
counter++;
try {
socket.receive(packet);
continueSending = false; // a packet has been received : stop sending
}
catch (SocketTimeoutException e) {
// no response received after 1 second. continue sending
}
}
我正在构建一个简单的客户端-服务器多人游戏,我想连接UDP套接字。但是,当我调用方法时,它会生成
因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:
我试图创建一个Unix套接字数据报示例。客户端可以流畅地发送和接收消息。在缓冲区长度小于< code>SOCKET_BUFFER_SIZE的情况下,服务器能够做到这一点,否则服务器的输出会在接收的缓冲区显示一些无效字符。 客户代码 服务器的代码 头文件 这是我得到的 奇怪的是,客户端收到了预期的消息,尽管服务器在发送之前没有正确格式化消息。 这是我的预期输出 我该如何解决?
我正在创建一个简单的服务器/客户端UDP套接字程序,我遇到了一个问题。 问题是recvfrom()函数一直在重新读取上次发送的数据。 因此,如果我从客户端向服务器发送两个数据包,那么recvfrom()将读取第一个数据包并打印其数据,然后它将不断地反复读取第二个数据包。 据我所知,一旦成功执行读取操作,数据包应该从套接字中删除,但这似乎没有发生。 我知道客户端没有重新发送数据,因为每当客户端发送数
当我尝试接收大量数据时,它会被切断,我必须按enter键才能获取其余数据。起初,我可以增加一点,但它仍然不会收到所有的。正如您所看到的,我增加了conn.recv()上的缓冲区,但它仍然无法获取所有数据。它会在某一点切断它。我必须在原始输入上按enter键才能接收其余数据。我是否可以一次获取所有数据?这是密码。
我使用Android应用程序通过TCP套接字与同一局域网上的PC java应用程序进行通信、发送和接收消息。下面是我在android中使用的Asynctask的代码,用于发送消息并从PC接收回复: } 我在onPostExcecute中的祝酒词中显示PC的回复。 Android通过BufferedWriter发送消息,而PC上的java应用程序在BufferedReader中接收消息。 PC在收到