2 hlhdidi hlhdidi 于 2016.04.21 22:00 提问

java udp发送端接收端变成问题求大神解答。

采用了多线程,如果发送端输入的是英文,接收端可以正常接收。
但是如果发送端输入的是中文,接收端无法接收,而且程序会卡。这是怎么回事?代码如下:
主程序代码:
public class ChatDemo {

public static void main(String[] args) throws IOException {
    DatagramSocket dss=new DatagramSocket();
    DatagramSocket dsr=new DatagramSocket(10002);
    Sends send=new Sends(dss);
    Receives rec=new Receives(dsr);

    new Thread(send).start();
    new Thread(rec).start();
}

}
发送端代码:
public class Sends implements Runnable {
private DatagramSocket ds;
public Sends(DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));
String s=null;
try {
while((s=bufr.readLine())!=null){

            byte [] b=s.getBytes();
            DatagramPacket dp=new DatagramPacket(b,b.length,InetAddress.getByName("192.168.0.103"),10002 );
            ds.send(dp);
            if(s.equals("over")){
                System.out.println();
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}
接收端代码:
public class Receives implements Runnable{
private DatagramSocket ds;
public Receives(DatagramSocket ds){
this.ds=ds;
}
public void run(){
while(true){
byte[] b=new byte[1024];
DatagramPacket dp=new DatagramPacket(b,b.length);
try {
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String s=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"....."+s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
困扰了我很长时间了。。求大神解答。

4个回答

hlhdidi
hlhdidi   2016.04.21 22:05

如果是第一次运行主程序代码就输入中文,第一次能被打印,但第二次开始,输入的中文在命令行中无法显示,且无法打印,这是为什么呢?

hlhdidi
hlhdidi   2016.04.21 22:04

如果是第一次运行主程序代码就输入中文,第一次能被打印,但第二次开始,输入的中文在命令行中无法显示,且无法打印,这是为什么呢?

hlhdidi
hlhdidi   2016.04.21 22:11

用DOS命令行输入中文没有问题,这是为什么呢?

daxiangaixue
daxiangaixue   2016.04.22 10:00

流没有关闭,导致程序死了。

hlhdidi
hlhdidi 没有明白,能详细说明一下吗?在DOS命令行运行没有问题,在eclipse里面输入英文没问题,输入中文产生问题,为什么呢
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
用 Java 模拟 UDP 传输的发送端和接收端
一、创建UDP传输的发送端 1、建立UDP的Socket服务; 2、将要发送的数据封装到数据包中; 3、通过UDP的Socket服务将数据包发送出去; 4、关闭Socket服务。
Udp发送端和接收端
//UdpReceive.java /* 定义udp的接收端。 思路: 1.定义udpSocket服务。通常会监听一个端口,其实就是这个接收网络应用程序定义一个数字标示。 2.定义一个数据包,用来存储接收到的字节数据。 因为数据包对象中有特有功能可以提取字节数据中不同数据信息。 3.通过Socket服务的receive方法将收到的数据存入已定义好的数据包中。 4.通过数据包对象的特有功能将这
UDP的发送端和接收端
udp的发送端: 需求:通过udp传输方式,将一段文字数据发送出去。, 定义一个udp发送端。 思路: 1,建立updsocket服务。 2,提供数据,并将数据封装到数据包中。 3,通过socket服务的发送功能,将数据包发出去。 4,关闭资源。 代码: import java.net.*; class UdpSend { public static void mai
模拟UDP传输的发送端和接收端
一、创建UDP传输的发送端 1、建立UDP的Socket服务;  2、将要发送的数据封装到数据包中;  3、通过UDP的Socket服务将数据包发送出去;  4、关闭Socket服务。 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import j
最简单UDP协议接收端和发送端
代码及思路 一.发送端 import java.net.*; public class UdpSendDemo { //4个步骤 public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //1.通过Datagra
Winsock:获取UDP数据发送端的IP地址和端口号
UDP的接收端使用函数 recvfrom接收数据,这个函数在winsock.h中定义如下: int recvfrom( __in SOCKET s, __out char* buf, __in int len, __in int flags, __out struct sockaddr* from
. 使用UDP协议编写一个网络程序,设置接收端程序的监听端口是8001,发送端发送的数据是“Hello, world”。
发送方 test 1 package 网络编程; import java.net.*; public class Test1 { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub byte[] buf=new byte[1024];
使用winsock+UDP写的一个简单接收端程序
本文原创,如转发,请标注原文链接地址:发表时间:2010-11-26  09:35:40本程序使用VS2008编写,代码如下://先打开服务器端,服务器在执行完recvfrom()后堵塞,等待接收数据... #include #include #pragma comment(lib,"WS2_32.LIB") void main() { WSADATA wsaData; SOCKET ReceivingSocket; SOCKADDR_IN
笔试题13:采用UDP协议,编写一个简单发送字符串的程序(源码)
UDP协议是一种无须建立连接的网络通信协议,采用Java来编写,一般有以下几个步骤:(包括接收端和发送端) 1、创建数据Socket,指定一个端口号; 2、对于接收消息的一端来说,提供一个byte数组进行数据的存储,而对于发送消息一端,除此之外还需要提供对端的IP地址和端口号; 3、调用DatagramPacket的receive()或send()方法进行数据的接收或发送; 4、调用Dat
使用UDP协议编写一个网络程序,设置接收端程序监听端口为8001,发送端发送的数据是“hello world”
21、使用UDP协议编写一个网络程序,设置接收端程序监听端口为8001,发送端发送的数据是“hello world”。 提示: 1)使用new DatagramSocket(8001)构造方法创建接收端的DatagramSocket对象,调用receive()方法接收数据。 2)发送端和接收端使用DatagramPacket封装数据,在创建发送端的DatagramPacket对象时需要指定目