java tcp中客户端不能接收到服务器的信息!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java tcp中客户端不能接收到服务器的信息!相关的知识,希望对你有一定的参考价值。

首先说下我程序的基本实现及问题所在:
两个图形界面(Server和Client,Client有两个按钮“链接”和“断开”)当Client“链接”时Server每隔五秒向Client发送系统时间信息。Client点击断开时,Client将字符“quit”传到服务器上,服务器接收到后将链接时长再发送给客户端,客户端显示出来。现在的问题是:服务器这边当客户端点击断开时接收到了“quit”,但是客户端却获取不了服务器发送的链接时长。代码如下希望那位大虾指点下:

客户端:
public void run() //线程正式"跑起来"
try
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
out.write("quit"); //当点击断开触发器时,将字符"quit"发送给服务器
out.flush(); //刷新
System.out.println("断开成功!");
try
System.out.println("这里应该有!");
if(in.ready())
System.out.println("有没有执行获取程序!"); 这里就输出不了了,之前可以输出
String i=in.readLine();//将读取缓存的数据转化为字符串
p.setText(i); //将获得的in作为字符串打印在文本框内
System.out.println("断开显示的问题!");

catch (Exception e)
e.printStackTrace();

in.close(); //关闭in
out.close(); //关闭流out
s.close(); //关闭socket
catch(Exception e)
e.printStackTrace();


服务器:服务器端都是可以输出的,应该没有任何问题!
while(true)
if(in.ready())
System.out.println("接收quit的最开始!");
String strWord=in.readLine(); System.out.println("接收quit第二次!");
System.out.println(strWord);
if(strWord.equals("quit")) /当捕获的字符串是"quit"时
long end = System.currentTimeMillis();//获取捕获"quit"数据时的时间
out.write("链接用时"+(end-start)+"毫秒"); //计算该客户链接的时间
System.out.println("链接用时"+(end-start)+"毫秒");
out.flush();
p.setText("客户端正常关闭!"); //打印客户的正常关闭

in.readLine(); 是要读到有换行符才结束的,在这个之前都是堵塞的
你在你发送的
out.write("quit"); ---->>out.write("quit/r");
out.write("链接用时"+(end-start)+"毫秒/r"); //计算该客户链接的时间
参考技术A 输入流InputStream 是否有数据,这样判断
int available()Returns an estimate of the number of bytes that can be read (or
skipped over) from this input stream without blocking by the next
invocation of a method for this input stream.
参考技术B 你在服务器端是先接受的吧 你应该把接受信息和发送信息放在两个不同的线程里面

Java 使用TCP UDP发送信息

Java 使用TCP UDP发送信息

网络通信的三要素

  1. IP地址
  2. 端口号
  3. 网络通信协议

TCP

客户端

import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClient 
    public static void main(String[] args) throws Exception 
        // 创建要发生的ip地址
        InetAddress inetAddress = InetAddress.getByName("localhost");
        // 创建套接字
        Socket socket = new Socket(inetAddress, 9999);
        // 拿到输入流
        OutputStream outputStream = socket.getOutputStream();
        // 向输入流中放入要发送的信息并发送
        outputStream.write("你好".getBytes());
        // 关闭
        outputStream.close();
        socket.close();
    

服务端

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer 

    public static void main(String[] args) throws Exception 
        // 创建服务器套接字,指定接收的端口
        ServerSocket serverSocket = new ServerSocket(9999);
        // 接收信息
        Socket socket = serverSocket.accept();
        // 下面是把信息存放到新的流中
        // 拿到输入流
        InputStream inputStream = socket.getInputStream();
        // 创建存放信息的数组输出流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        // 逐行读取信息放入buffer并放到输出流中
        while ((len = inputStream.read(buffer)) != -1)
            byteArrayOutputStream.write(buffer, 0, len);
        // 输出接收到的信息
        System.out.println(byteArrayOutputStream);
        // 关闭
        byteArrayOutputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    

先启动服务端,再启动客户端,之后可以看到服务端收到了客户端发的信息

UDP

发送端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpSender 
    public static void main(String[] args) throws Exception 
        DatagramSocket datagramSocket = new DatagramSocket();
        InetAddress inetAddress = InetAddress.getByName("localhost");
        DatagramPacket datagramPacket = new DatagramPacket(
                "你好".getBytes(),           // 发送的数据
                0,                          // 数据长度从0开始 
                "你好".getBytes().length,    // 到末尾结束
                inetAddress,                // ip地址
                20000                       // 端口号
        );
        // 发送
        datagramSocket.send(datagramPacket);
        datagramSocket.close();
    

接收端

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpReceiver 
    public static void main(String[] args) throws Exception 
        DatagramSocket socket = new DatagramSocket(20000);
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0 , buffer.length);
        socket.receive(packet);
        System.out.println(new String(packet.getData(), 0, packet.getLength()));
    

先启动接收端,再启动发送端

以上是关于java tcp中客户端不能接收到服务器的信息!的主要内容,如果未能解决你的问题,请参考以下文章

tcp编程socket编程

java或者scala写socket客户端发送头消息和消息体到服务端并接收返回信息,这个头消息怎么写

TCP Socket在C#中接收数据错误

Java 使用TCP UDP发送信息

Java 使用TCP UDP发送信息

TCP客户端(java)没有从TCP服务器(C#)接收消息