Java 向服务器发送数据时返回Null
下面的客户端Java 向服务器发送数据时返回Null,java,Java,下面的客户端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; imp
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TCPclient {
public static void openChat() throws UnknownHostException, IOException {
Scanner keyboard = new Scanner(System.in);
boolean exit = false;
while (!exit) {
String input = keyboard.nextLine();
if(input != null) {
if ("quit".equals(input)) {
System.out.println("Exit programm");
exit = true;
} else if ("/".equals(input)) {
//Do something
getInput();
}
}
}
}
public static void getInput() throws UnknownHostException, IOException {
Scanner scan = new Scanner(System.in);
String message = scan.nextLine();
sendMessage(message);
openChat();
}
public static void sendMessage(String message) throws UnknownHostException, IOException {
Socket sock = new Socket("localhost", 9999);
InputStream input = sock.getInputStream();
OutputStream output = sock.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
PrintWriter writer = new PrintWriter(output, true);
System.out.println(message);
writer.write(message);
sock.close();
}
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("Type / to chat or quit to exit");
openChat();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
class ServiceThread extends Thread {
Socket sock;
public ServiceThread(Socket sock) {
this.sock = sock;
}
public void run() {
try {
InputStream input = sock.getInputStream();
OutputStream output = sock.getOutputStream();
byte request[] = new byte[100];
input.read(request);
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
PrintWriter writer = new PrintWriter(output, true);
String message = reader.readLine();
System.out.println(message);
sock.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class TCPserver {
static ArrayList<ServiceThread> theClients = new ArrayList<ServiceThread>();
public TCPserver() {
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket serSock = new ServerSocket(9999);
while(true) {
Socket sock = serSock.accept();
ServiceThread server = new ServiceThread(sock);
theClients.add(server);
server.start();
}
}
}
下面的服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TCPclient {
public static void openChat() throws UnknownHostException, IOException {
Scanner keyboard = new Scanner(System.in);
boolean exit = false;
while (!exit) {
String input = keyboard.nextLine();
if(input != null) {
if ("quit".equals(input)) {
System.out.println("Exit programm");
exit = true;
} else if ("/".equals(input)) {
//Do something
getInput();
}
}
}
}
public static void getInput() throws UnknownHostException, IOException {
Scanner scan = new Scanner(System.in);
String message = scan.nextLine();
sendMessage(message);
openChat();
}
public static void sendMessage(String message) throws UnknownHostException, IOException {
Socket sock = new Socket("localhost", 9999);
InputStream input = sock.getInputStream();
OutputStream output = sock.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
PrintWriter writer = new PrintWriter(output, true);
System.out.println(message);
writer.write(message);
sock.close();
}
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("Type / to chat or quit to exit");
openChat();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
class ServiceThread extends Thread {
Socket sock;
public ServiceThread(Socket sock) {
this.sock = sock;
}
public void run() {
try {
InputStream input = sock.getInputStream();
OutputStream output = sock.getOutputStream();
byte request[] = new byte[100];
input.read(request);
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
PrintWriter writer = new PrintWriter(output, true);
String message = reader.readLine();
System.out.println(message);
sock.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class TCPserver {
static ArrayList<ServiceThread> theClients = new ArrayList<ServiceThread>();
public TCPserver() {
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket serSock = new ServerSocket(9999);
while(true) {
Socket sock = serSock.accept();
ServiceThread server = new ServiceThread(sock);
theClients.add(server);
server.start();
}
}
}
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.OutputStream;
导入java.io.PrintWriter;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.nio.charset.StandardCharset;
导入java.util.ArrayList;
类ServiceThread扩展线程{
插座;
公共服务线程(套接字套接字){
this.sock=sock;
}
公开募捐{
试一试{
InputStream输入=sock.getInputStream();
OutputStream output=sock.getOutputStream();
字节请求[]=新字节[100];
输入。读取(请求);
BufferedReader reader=新的BufferedReader(新的InputStreamReader(输入));
PrintWriter=新的PrintWriter(输出,真);
字符串消息=reader.readLine();
System.out.println(消息);
sock.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
公共类TCPserver{
静态ArrayList客户端=新建ArrayList();
公共TCPserver(){
}
公共静态void main(字符串[]args)引发IOException{
//TODO自动生成的方法存根
ServerSocket serSock=新的ServerSocket(9999);
while(true){
Socket sock=serSock.accept();
ServiceThread服务器=新的ServiceThread(sock);
添加(服务器);
server.start();
}
}
}
当我想要返回客户端的消息时,返回null。
我是新来的,所以告诉我,如果我只是做错了。
另外,我想知道你们是如何了解这些信息的,因为我想了解更多信息,不知道从哪里了解这些信息。在您的实现中存在服务器问题
ServiceThread
内部,run
方法关闭sock(socket)
这就是为什么连接在启动后关闭运行:
public void run() {
try {
DataInputStream inputStream = new DataInputStream(sock.getInputStream());
//DataOutputStream output = new DataOutputStream(sock.getOutputStream());
String str=(String)inputStream.readUTF();
System.out.println("Client Echo:" + str);
//sock.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
还需要修改客户端实现:
- 您可以在
sendMessage
方法中初始化套接字连接。因此,您无法与服务器通信。因此,在构造函数中初始化socket
修改的TCPclient
:
public class TCPclient {
DataOutputStream dataOutputStream = null;
public TCPclient() throws UnknownHostException, IOException {
Socket sock = new Socket("localhost", 9999);
dataOutputStream = new DataOutputStream(sock.getOutputStream());
}
public void sendMessage(String message) throws UnknownHostException, IOException {
System.out.println(message);
dataOutputStream.writeUTF(message);
}
public static void main(String[] args) throws UnknownHostException, IOException {
TCPclient tcPclient = new TCPclient();
System.out.println("Type / to chat or quit to exit");
tcPclient.sendMessage("Hello From Client");
tcPclient.openChat();
}
}
它对我有用。试试看。我使用DataInputpStream
和DataOutputStrem
而不是InputStream
和OutputStream
,这些都不是主要问题。是哪一行?我从网络(而不是YouTube)上学习,从阅读和做许多书籍中的练习,以及多年的编程中学习。你认为input.read(request)
在做什么?看起来,在服务器上,你从流中读取,然后创建了一个BufferedReader,然后从中读取。那么也许就没有什么可看的了?你的网络沟通观念很差。如果不重写整个包,很难修改。概念是错误的,您的修改会使概念变成僵尸。客户端打开了一个套接字,并使其“未关闭”。ServiceThread也是如此。这很糟糕。非常糟糕。不是这样的,我只是想把重点放在实际问题上。根据任何情况关闭插座。如果str.equals(“/”)返回true,则调用socket.close()。。。