[英]Server-Client in java using TCP/IP.Cannot send/receive messages
So I was making a simple chat application to get a kick-start in Java Networking.I am using TCP/IP.The problem is that the client does not send/receive data from the server, and neither does the server.Where am I doing it wrong? 因此,我正在制作一个简单的聊天应用程序以启动Java Networking。我正在使用TCP / IP,问题是客户端不从服务器发送/接收数据,服务器也不发送/接收数据。做错了? Here is my server class:
这是我的服务器类:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server implements Runnable {
static InetAddress address;
static ArrayList<Integer> clients=new ArrayList<Integer>();
static ArrayList<Socket> s=new ArrayList<Socket>();
static String message;
static byte[] mess=new byte[2048];
static DataOutputStream toClient;
public Server(InetAddress address){
this.address=address;
}
public static void main(String[] args) throws IOException
{
ServerSocket socket=new ServerSocket(8000);
System.out.println("Server started on port 8000");
while(true)
{
Socket socketNew=socket.accept();
s.add(socketNew);
address=socketNew.getInetAddress();
System.out.println("connected to client at address: "+address);
InputStream is=socketNew.getInputStream(); //receiving from client
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
message=br.readLine();
Server server=new Server(address);
//new Thread(server).start();
}
}
public void run() {
for(Socket socket:s) //to send message to all clients
{
OutputStream os;
try {
os = socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(osw);
bw.write(message);
bw.flush();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
And here are my client class' send and receive functions: 这是我的客户端类的发送和接收函数:
private void send_data() {
try {
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(osw);
String sendMessage=this.getName()+": "+textField.getText();
bw.write(sendMessage);
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
private void receive_data()
{
try {
InputStream is = socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String toConsole=br.readLine();
console(toConsole);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
I don't know how did you wrote your client code to connect to the Server
, and I don't know if you setup your ip-configuratoin
right or wrong. 我不知道您是如何编写客户端代码来连接
Server
,也不知道您是否对ip-configuratoin
设置。
Typically there is little trick in writing something through Socket
and ServerSocket
and it is to add a line separator at the end of your message to enable the other side to readLine()
from socket. 通常,通过
Socket
和ServerSocket
编写内容的技巧很少,它是在消息的末尾添加行分隔符,以使另一端能够从套接字readLine()
。
This can be achieved by appending \\n
to the message. 这可以通过在消息后附加
\\n
来实现。 But I myself prefer to use PrintWriter
instead of BufferedWriter
, because it has a set of elegant overloaded println
methods which do this for you automatically: 但是我自己更喜欢使用
PrintWriter
而不是BufferedWriter
,因为它具有一组优雅的重载println
方法,这些方法可以自动为您执行此操作:
PrintWriter p = new PrintWriter(bw);
p.println(message);
Hope this would be helpful. 希望这会有所帮助。
Your server is waiting to receive /n terminated message from the client. 您的服务器正在等待接收来自客户端的/ n终止消息。
Server Code: 服务器代码:
package general;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class ChatServer implements Runnable {
static InetAddress address;
static ArrayList<Integer> clients=new ArrayList<Integer>();
static ArrayList<Socket> s=new ArrayList<Socket>();
static String message;
static byte[] mess=new byte[2048];
static DataOutputStream toClient;
public ChatServer(InetAddress address){
this.address=address;
}
public static void main(String[] args) throws IOException
{
ServerSocket socket=new ServerSocket(9000);
System.out.println("Server started on port 9000");
while(true)
{
Socket server=socket.accept();
s.add(server);
address=server.getInetAddress();
System.out.println("connected to client at address: "+address);
BufferedReader br = new BufferedReader(new InputStreamReader(server.getInputStream()));
String resp = br.readLine();
System.out.println("Server received from Client:" + resp);
server.close();
/*
DataInputStream in = new DataInputStream(socketNew.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out =
new DataOutputStream(socketNew.getOutputStream());
out.writeUTF("Thank you for connecting to "
+ socketNew.getLocalSocketAddress() + "\nGoodbye!");
*/
}
}
public void run() {
for(Socket socket:s) //to send message to all clients
{
OutputStream os;
try {
os = socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(osw);
bw.write(message);
bw.flush();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Client Code: 客户代码:
public static void main(String[] args) {
try {
client=new Socket("127.0.0.1",9000);
System.out.println("connected to: " + client.getRemoteSocketAddress());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
String sendingMessage = "Hello Server - This is the client!\n";
bw.write(sendingMessage);
bw.flush();
System.out.println("Message sent to the server : "+ sendingMessage);
/*
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hello from \n" + client.getLocalSocketAddress());
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
System.out.println("Server says " + in.readUTF());
*/
client.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Output: 输出:
Server: Server started on port 9000 connected to client at address: /127.0.0.1 Server received from Client:Hello Server - This is the client! 服务器:服务器在连接到客户端的端口9000上启动,地址为/127.0.0.1从客户端:Hello服务器收到服务器-这是客户端!
Client: connected to: /127.0.0.1:9000 Message sent to the server : Hello Server - This is the client! 客户端:连接到:/127.0.0.1:9000发送到服务器的消息:Hello Server-这是客户端!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.