gpt4 book ai didi

也发送文件的Java聊天程序

转载 作者:行者123 更新时间:2023-12-01 10:05:33 26 4
gpt4 key购买 nike

我制作了一个基本的聊天程序,它也可以发送,但它不完整。一切运行正常,除了当我发送文件时,我的程序接收它没有任何问题,但它给出了套接字关闭错误。

客户端

import java.net.*;
import java.io.*;

public class chatClnt {

public static int PORT = 6666;
public static String IP_ADDR = "192.168.15.1";
public static String F = "FILE MODE";

public static void main(String[] ar) {

try {
InetAddress ipAddress = InetAddress.getByName(IP_ADDR);

System.out.println("\nconnecting......");
Socket socket = new Socket(ipAddress, PORT);
System.out.println("\nconnected");

InputStream sin = socket.getInputStream();
OutputStream sout = socket.getOutputStream();

DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);

BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));

String line = null;
String fname = null;

while (true) {
System.out.println("\nYou(Plain Text):>");
line = keyboard.readLine();
out.writeUTF(line);
out.flush();
if (line.equals(F)) {
//Sending File
OutputStream fout = socket.getOutputStream();
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
System.out.println("Enter the path: ");
fname = keyboard.readLine();
File myFile = new File(fname);
byte[] mybytearray = new byte[(int)myFile.length()];
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);

fout = socket.getOutputStream();
System.out.println("Sending " + fname + "(" + mybytearray.length + " bytes)");
fout.write(mybytearray,0,mybytearray.length);
fout.flush();
System.out.println("Done.");
} finally {
if (bis != null) bis.close();
if (fout != null) fout.close();
}


line = in.readUTF(); // wait for the server to send a line of text.
System.out.println("\nSender(Plain Text):> " + line);
System.out.println();
}
}
} catch(Exception x) {
x.printStackTrace();
}
}
}

服务器

import java.net.*;
import java.io.*;


public class chatSrv {

public static int PORT = 6666;
public static String F = "FILE MODE";
public final static String FILE_TO_RECEIVE = "received.txt";
public final static int FILE_SIZE = 999999999;

public static void main(String[] ar) {

try {
ServerSocket ss = new ServerSocket(PORT);
System.out.println("\nconnecting...");
Socket socket = ss.accept();

System.out.println("\nconnected");
System.out.println();

InputStream sin = socket.getInputStream();
OutputStream sout = socket.getOutputStream();

DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);

String line = null;
int bytesRead;
int current = 0;

while (true) {
line = in.readUTF();

//Receiving File
if (line.equals(F)) {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
byte [] mybytearray = new byte [FILE_SIZE];
fos = new FileOutputStream(FILE_TO_RECEIVE);
bos = new BufferedOutputStream(fos);
bytesRead = sin.read(mybytearray,0,mybytearray.length);
current = bytesRead;

do {
bytesRead = sin.read(mybytearray, current, (mybytearray.length-current));
if (bytesRead >= 0) current += bytesRead;
} while (bytesRead > -1);

bos.write(mybytearray, 0 , current);
bos.flush();
System.out.println("File " + FILE_TO_RECEIVE+ " downloaded (" + current + " bytes read)");
} finally {
if (fos != null) fos.close();
if (bos != null) bos.close();
}

System.out.println("\nSender(Plain Text):> " + line);
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));

System.out.println("\nYou(Plain Text):>");
line = keyboard.readLine();
out.writeUTF(line);
out.flush();
System.out.println();
}
}
} catch(Exception x) {
x.printStackTrace();
}
}
}

最佳答案

当您关闭套接字的输出流时,也会关闭套接字。 documentation说:

Closing the returned OutputStream will close the associated socket.

所以你无法关闭流。但如果你不关闭它,你将永远不会在接收端得到-1

所以基本上,您不能使用与从磁盘读取文件时相同的读取过程。您需要设计一种协议(protocol),允许您在保持流打开的同时读取文件。可能的策略:

  • 为此打开第二个套接字。例如,在可用端口上打开一个套接字,并向服务器发送一条消息,指示它应该使用此端口号连接到另一个套接字。然后您可以通过另一个套接字发送整个文件并关闭它。或者要求服务器打开第二个套接字并告诉您要连接到哪个端口号。这是ftp协议(protocol)使用的策略。
  • 提前发送文件的长度(以字节为单位),并在接收端读取那么多字节。这是 HTTP 使用的策略,例如,当它发送 Content-length: header 时。

请记住,文件可能非常长,因此如果您决定发送长度,请使用 long 而不是 int

关于也发送文件的Java聊天程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36501313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com