[英]Java Server Socket Response
I'm trying to create a simple client/server socket communication application (chat client). 我正在尝试创建一个简单的客户端/服务器套接字通信应用程序(聊天客户端)。 I've spent countless hours looking on how to fix this with still no luck, I can send the message to the server but I'm stuck with sending the message back from the server to the client.
我花了无数个小时看着如何解决这个仍然没有运气,我可以将消息发送到服务器,但我坚持将消息从服务器发送回客户端。
I believe the issue is how I'm getting the message from the server after it's sent back, I deleted what I had which was an InputStreamReader which I couldn't get to work. 我相信问题是我在收到邮件之后从服务器收到邮件的方式,我删除了我所拥有的一个我无法工作的InputStreamReader。
(I apologize in advance for the sloppy code) (我提前为草率代码道歉)
Server.java Server.java
public class Server extends Thread {
@SuppressWarnings("unused")
private static Socket socket;
static int port = 1337;
static ObjectOutputStream output;
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException{
ServerSocket ss = new ServerSocket(port);
System.out.println("Server started on port: " + port);
while(!Thread.interrupted()){
try {
Socket clientSocket = ss.accept();
DataInputStream dis = new DataInputStream(clientSocket.getInputStream());
PrintStream output = new PrintStream(clientSocket.getOutputStream());
String str = (String)dis.readUTF();
String[] split = str.split("-");
String subStringUsername = split[0];
String subStringMessage = split[1];
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("h:mm:ss a");
String formattedTimestamp = sdf.format(date);
System.out.println("Message from " + subStringUsername + ": " + subStringMessage + " - at " + formattedTimestamp);
output.flush();
output.println("Message received! Hello client!");
System.out.println("Reply sent");
output.flush();
//TODO create new thread handle new users instead of Thread sleep
//TODO chat commands and user ID / can't be existing user
Thread.sleep(500);
}
catch(Exception e){
System.out.println(e);
}
}
}
getMessage.java getMessage.java
public class GetMessage extends Thread {
public void run(){
while(true) {
InputStreamReader be = new InputStreamReader();
}
}
}
This is what I have left of the getMessage class as I deleted everything in frustration, I'm running getMessage as a thread which I don't know is the best way or not. 这是我在getMessage类中留下的内容,因为我在挫折中删除了所有内容,我正在运行getMessage作为一个线程,我不知道这是最好的方法。 I've tried 10's of methods to get the message from the server with still not luck, if someone could point me in the right direction I would be greatly appreciative.
我已经尝试了10种方法从服务器获取消息仍然没有运气,如果有人能指出我正确的方向我会非常感激。
readUTF blocks until it receives end of input, and should only be reading data that passed through the writeUTF method. readUTF阻塞直到它接收到输入结束,并且应该只读取通过writeUTF方法传递的数据。
reference: for a more complete discussion. 参考:进行更完整的讨论。
readUTF() causing Android app to hang readUTF()导致Android应用程序挂起
Also check out the docs 另请查看文档
you will probably want to replace 你可能想要替换
DataInputStream dis = new DataInputStream(clientSocket.getInputStream());
with 同
BufferedReader reader = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
and 和
dis.readUTF();
with 同
String str = reader.readLine();
or, if you are not using new lines to mark the end of a message 或者,如果您没有使用新行标记消息的结尾
char[] buffer = new char[1024];
int read = 0;
StringBuilder sb = new StringBuilder();
while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
sb.append(buffer, 0, read);
// conduct some test that when passes marks the end of message, then break;
}
reader.close();
String str = sb.toString().trim();
please put output.close() after the flush method or once you are done flushing the out stream. 请在flush方法之后或者在完成刷新输出流之后输出output.close()。
Also I would use something like this to implement a chat application. 我也会用这样的东西来实现聊天应用程序。 It also uses Java Swings to draw client and server window.
它还使用Java Swings来绘制客户端和服务器窗口。 Use it as a reference.
用它作为参考。 The formatting might be little sloppy here.
这里的格式可能有点草率。
This is my client code: 这是我的客户端代码:
public class Client
{
private Socket s;
private Scanner input;
private PrintWriter output;
private ChatFrame frame;
static String s1;
public Client( int port ) throws IOException
{
s = new Socket( "127.0.0.1", port );
input = new Scanner(s.getInputStream());
output = new PrintWriter(s.getOutputStream());
}
public static void main(String[] args) throws java.io.IOException
{
System.out.println("Enter The port No. :");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
System.out.println("Enter Name : ");
br = new BufferedReader(new InputStreamReader(System.in));
s1 = br.readLine();
final Client client = new Client(Integer.parseInt(s));
EventQueue.invokeLater(new Runnable()
{
public void run() {
client.frame = new ChatFrame(client.output,s1);
}
});
String ClientChat = "";
while(true)
{
if(client.input.hasNextLine())
{
ClientChat = client.input.nextLine();
client.frame.Chat(ClientChat);
}
}
}
}
class ChatFrame
{
JFrame jf;
JPanel jp;
JTextArea jta1,jta2;
JButton jb;
public ChatFrame(final PrintWriter output, final String Name)
{
jf = new JFrame();
jf.setTitle(Name);
jf.setSize(800,600);
jp = new JPanel();
jp.setBounds(0,0,800,600);
jta1 = new JTextArea();
jta2 = new JTextArea();
jta1.setBounds(20,10,760,390);
jta1.setBorder(BorderFactory.createLineBorder(Color.BLACK,2));
jta2.setBounds(20,420,550,100);
jta2.setBorder(BorderFactory.createLineBorder(Color.BLACK,2));
jb = new JButton("SEND");
jb.setBounds(590,420,190,100);
jp.add(jb);
jp.add(jta1);
jp.add(jta2);
jp.setLayout(null);
ActionListener Action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String str = Name + " : " + jta2.getText();
if(str.length() > 0)
{
output.println(str);
output.flush();
jta2.setText("");
jta2.grabFocus();
}
}
};
jb.addActionListener(Action);
jf.add(jp);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
public void Chat(String MSG)
{
jta1.append(MSG + "\n");
StringTokenizer st = new StringTokenizer(MSG,":");
int flag = 0;
if(st.hasMoreElements())
{
if(st.nextElement() == "bye" && flag == 0)
{
jf.setVisible(false);
jf.validate();
System.exit(0);
}
flag = 1;
}
}
}
and here is my server code: 这是我的服务器代码:
public class MyServer
{
Hashtable<Socket,PrintWriter> output = new Hashtable<Socket,PrintWriter>();
ServerSocket ss;
Socket s;
public void MakeConn()
{
try
{
ss = new ServerSocket(1001);
while(true)
{
s = ss.accept();
System.out.println("Connection from " + s);
PrintWriter outMsg = new PrintWriter(s.getOutputStream());
output.put(s,outMsg);
new ServerThread(this,s);
}
}
catch(Exception E)
{
}
}
public void tellEveryOne(String msg)
{
synchronized(output)
{
Enumeration keys = output.keys();
while ( keys.hasMoreElements() )
{
Socket ss = (Socket)keys.nextElement();
PrintWriter outMsg = output.get( ss );
outMsg.println(msg);
outMsg.flush();
}
}
}
public void ConnectionClose(Socket socket)
{
try
{
output.remove(socket);
socket.close();
}
catch(IOException e)
{
}
}
public static void main(String[] args)
{
MyServer ms = new MyServer();
ms.MakeConn();
}
}
class ServerThread extends Thread
{
MyServer server;
Socket socket;
public ServerThread(MyServer server, Socket socket)
{
this.server = server;
this.socket = socket;
this.start();
}
public void run()
{
try
{
Scanner input = new Scanner(socket.getInputStream());
String inMsg;
String ByeMsg;
while(true)
{
if(input.hasNextLine())
{
inMsg = input.nextLine();
System.out.println(inMsg);
StringTokenizer st = new StringTokenizer(inMsg,":");
int flag = 0;
if(st.hasMoreElements())
{
if(st.nextElement() == "bye" && flag == 0)
{
input.close();
socket.close();
break;
}
flag = 1;
}
server.tellEveryOne(inMsg);
}
}
}
catch(IOException E)
{
}
finally
{
server.ConnectionClose(socket);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.