java中tcp通信下载文件为什么第一行无法读取

Python016

java中tcp通信下载文件为什么第一行无法读取,第1张

这是因为tcp协议中有一个叫做“Nagle算法”的机制,它会限制发送方发送数据的速度,以减少网络繁忙程度,从而提高网络效率。这就意味着,如果发送方发送的数据量小于一定的阈值,接收方就会一直等待接收,直到超时或者接收到满足阈值的数据才会返回。因此,如果发送方发送的数据量小于阈值,那么接收方就会一直等待,直到超时或者接收到满足阈值的数据才会返回,这就是为什么第一行无法读取的原因。

支持。java因其具备这项功能,也是支持tcp/ip协议的,Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因Java语言具有功能强大和简单易用两个特征。

1.TCP服务端的程序编写

package test

import java.io.BufferedReader

import java.io.InputStreamReader

import java.net.ServerSocket

import java.net.Socket

public class MyTcp{

private BufferedReader reader

private ServerSocket serverSocket

private Socket socket

/**

* 创建服务端的程序,读取客户端传来的数据

*/

void getserver(){

try {

serverSocket = new ServerSocket(8998) //实例化服务端socket

System.out.println("服务器套接字已经创建成功")

while (true) {

System.out.println("等待客户机的连接:")

socket = serverSocket.accept() //实例化socket对象

reader = new BufferedReader(new InputStreamReader(socket.getInputStream())) //实例化BufferReader对象

getClientMessage()

}

} catch (Exception e) {

e.printStackTrace()

}

}

private void getClientMessage() {

try {

while (true) {

System.out.println("客户机传来的信息是:"+reader.readLine())

}

} catch (Exception e) {

e.printStackTrace()

}

}

public static void main(String[] args) {

MyTcp myTcp = new MyTcp() //创建本类对象

myTcp.getserver()

}

}

2.TCP客户端程序编写

package test

import java.awt.BorderLayout

import java.awt.Container

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.io.PrintWriter

import java.net.Socket

import java.nio.channels.WritableByteChannel

import javax.swing.JFrame

import javax.swing.JScrollPane

import javax.swing.JTextArea

import javax.swing.JTextField

import javax.swing.border.BevelBorder

public class MyTcpClient extends JFrame{

private PrintWriter printWriter

Socket socket

private JTextField jTextField = new JTextField()

private JTextArea jTextArea = new JTextArea()

Container container

/**

* 创建的Tcp客户端程序

*/

public MyTcpClient (String title) {

super(title)

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

container = this.getContentPane()

final JScrollPane jScrollPane = new JScrollPane()

jScrollPane.setBorder(new BevelBorder(BevelBorder.RAISED)) //显示边框

getContentPane().add(jScrollPane,BorderLayout.CENTER)

jScrollPane.setViewportView(jTextArea)

container.add(jTextField,"South") //将文本框放在窗体下面

jTextField.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

printWriter.println(jTextField.getText()) //将文本框的信息写入流(为下面的输出流写入信息做准备)

jTextArea.append(jTextField.getText() + "\n")

jTextArea.setSelectionEnd(jTextArea.getText().length())

jTextField.setText(null)

}

})

}

private void connect() {

jTextArea.append("尝试连接中...\n")

try {

socket = new Socket("127.0.0.1",8998)

printWriter = new PrintWriter(socket.getOutputStream(),true) //将printwriter中的信息流写入到套接字的输出流传送给服务端

jTextArea.setText("已完成连接\n\n")

} catch (Exception e) {

e.printStackTrace()

}

}

public static void main(String[] args) {

MyTcpClient myTcpClient = new MyTcpClient("向服务器发送数据")

myTcpClient.setSize(500,200)

myTcpClient.setVisible(true)

myTcpClient.connect()

}

}

3.效果展示

<1>先将服务端的程序跑起来

<2>再将客户端的程序跑起来

<3>.客户端和服务端进行交互