Я создаю приложение для чата один на один с помощью языка программирования Java У меня возникла проблема: клиент не может отправить новое сообщение, пока не получит сообщение с сервера.Java-сокет: как сервер может читать несколько строк от клиента
ответ
У вас должно быть многопоточное приложение. Клиент будет запускать 2 потока: 1) Отправитель, который будет запускаться на кнопке отправки. Вы можете каждый раз создавать новый экземпляр этого потока при нажатии кнопки отправки. 2) Поток приемника будет продолжать работать непрерывно и проверять поток для любого сообщения. Как только он получит сообщение в потоке, он будет писать то же самое на консоли.
В ближайшее время обновит код. Благодаря
Письменное этот код долго назад так же вы можете написать сервер, используя другой порт
package com.clients;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ClientFullDuplex extends JFrame implements ActionListener {
private JFrame jframe;
private JPanel jp1, jp2;
private JScrollPane jsp;
private JTextArea jta;
private JTextField jtf;
private JButton send;
private Thread senderthread;
private Thread recieverthread;
private Socket ds;
private boolean sendflag;
public static void main(String[] args) {
try {
ClientFullDuplex sfd = new ClientFullDuplex();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ClientFullDuplex() throws UnknownHostException, IOException {
initGUI();
ds = new Socket("127.0.0.1", 1124);
initNetworking();
}
public void initGUI() {
jframe = new JFrame();
jframe.setTitle("Client");
jframe.setSize(400, 400);
jp1 = new JPanel();
jta = new JTextArea();
jsp = new JScrollPane(jta);
jtf = new JTextField();
send = new JButton("Send");
send.addActionListener(this);
jp1.setLayout(new GridLayout(1, 2, 10, 10));
jp1.add(jtf);
jp1.add(send);
jframe.add(jp1, BorderLayout.SOUTH);
jframe.add(jsp, BorderLayout.CENTER);
jframe.setVisible(true);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jta.append("hello client");
}
@Override
public synchronized void addWindowListener(WindowListener arg0) {
// TODO Auto-generated method stub
super.addWindowListener(arg0);
new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) {
// TODO Auto-generated method stub
if (ds != null)
try {
ds.close();
System.exit(0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
public void initNetworking() {
try {
recieverthread = new Thread(r1);
recieverthread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
Runnable r1 = new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()
+ "Reciver Thread Started");
recieveMessage(ds);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Runnable r2 = new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()
+ "Sender Thread Started");
sendMessage(ds);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
public void recieveMessage(Socket rms) throws IOException {
while (true) {
System.out.println(Thread.currentThread().getName()
+ "Reciver Functionality");
BufferedReader br = new BufferedReader(new InputStreamReader(
rms.getInputStream()));
String line = br.readLine();
System.out.println(line);
jta.append("\nServer:"+line);
}
}
public void sendMessage(Socket sms) throws IOException {
System.out.println(Thread.currentThread().getName()
+ "Sender Functionality");
PrintWriter pw = new PrintWriter(sms.getOutputStream(), true);
String sline = jtf.getText();
System.out.println(sline);
pw.println(sline);
jtf.setText("");
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource() == send) {
senderthread = new Thread(r2);
senderthread.start();
}
}
}
Зачем ему нужно создавать новый поток для каждого события отправки? – Kayaman
Это код, который я копировать и редактировать с вашей предыдущей публикации. Проблема заключается в том, что входной поток из сокета блокируется. Поэтому мое предложение - прочитать асинхронные сокеты в java и реорганизовать код ниже. рядом с тем, что это не так сложно редактировать сообщения.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Server {
public static void main(String[] args) {
Server chatServer = new Server(5555);
System.out.println("###Start listening...###");
chatServer.startListening();
chatServer.acceptClientRequest();
}
private ServerSocket listeningSocket;
private Socket serviceSocket;
private int TCPListeningPort;
private ArrayList<SocketHanding> connectedSocket;
public Server(int TCPListeningPort)
{
this.TCPListeningPort = TCPListeningPort;
connectedSocket = new ArrayList<SocketHanding>();
}
public void startListening()
{
try
{
listeningSocket = new ServerSocket(TCPListeningPort);
}
catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void acceptClientRequest()
{
try
{
while (true)
{
serviceSocket = listeningSocket.accept();
SocketHanding _socketHandling = new SocketHanding(serviceSocket);
connectedSocket.add(_socketHandling);
Thread t = new Thread(_socketHandling);
t.start();
System.out.println("###Client connected...### " + serviceSocket.getInetAddress().toString());
}
}
catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
class SocketHanding implements Runnable
{
private Socket _connectedSocket;
private PrintWriter socketOut;
private InputStream socketIn;
private boolean threadRunning = true;
private String rmsg;
public SocketHanding(Socket connectedSocket) throws IOException
{
_connectedSocket = connectedSocket;
socketOut = new PrintWriter(_connectedSocket.getOutputStream(), true);
socketIn = _connectedSocket.getInputStream();
}
private void closeConnection() throws IOException
{
threadRunning = false;
socketIn.close();
socketOut.close();
_connectedSocket.close();
}
public void sendMessage(String message)
{
socketOut.println(message);
}
private String receiveMessage() throws IOException
{
String t = "";
if (_connectedSocket.getInputStream().available() > 0)
{
byte[] b = new byte[8192];
StringBuilder builder = new StringBuilder();
int bytesRead = 0;
if ((bytesRead = _connectedSocket.getInputStream().read(b)) > -1)
{
builder.append(new String(b, 0, b.length).trim());
}
t = builder.toString();
}
return t;
}
@Override
public void run()
{
while (threadRunning)
{
try
{
rmsg = receiveMessage();
System.out.println(rmsg);
if(rmsg.equalsIgnoreCase("bye"))
{
System.out.println("###...Done###");
closeConnection();
break;
}
else
{
String smsg = "";
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
smsg = keyboard.readLine();
keyboard.close();
sendMessage("Server: "+smsg);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
- 1. Сервер не может читать все сообщения от клиента?
- 2. Как сервер может принимать несколько запросов от клиента без выключения?
- 3. не может читать несколько строк из sqldatareader
- 4. java - клиент - сервер несколько сообщений от клиента
- 5. Сервер не может получить сообщение от клиента
- 6. Как отправить данные от клиента на сервер
- 7. Как читать запрос GET от клиента C
- 8. Как читать несколько текстовых строк
- 9. сервер сокет, который ожидает сообщения от клиента читать
- 10. Как читать данные непосредственно от клиента?
- 11. Как отправить и получить несколько данных от клиента на сервер
- 12. Как защитить данные клиента, где пользователь не может читать
- 13. socket.io Как читать сертификат клиента
- 14. Как читать несколько строк, используя fgets()
- 15. Отправить несколько ответов на сервер от клиента в C
- 16. Как читать несколько строк из потока сокетов?
- 17. Как читать несколько строк в одной строке?
- 18. Как сервер может хранить IP-адрес клиента?
- 19. как http-сервер получил файл от клиента
- 20. Сервер C++ не может получать данные от клиента/Winsock
- 21. Как читать несколько строк в cpp?
- 22. Как читать несколько строк в Spark?
- 23. Как читать несколько строк в C++
- 24. Unix: Как я могу читать несколько строк?
- 25. Как читать несколько строк из csv
- 26. Как читать несколько строк в одной строке?
- 27. Сервер не может печатать данные, полученные от клиента
- 28. Может ли веб-сервер отправлять данные без запроса от клиента?
- 29. Сервер не может получить текст от клиента java
Разместите код здесь или вниз голосование пришедшего –
@ mr.icetea вы можете задать вопрос по-другому. – Blaatz0r
Все зависит от того, как вы закодировали как клиент, так и сервер. У вас есть одно или несколько подключений на одного клиента? У вас есть один поток в рассылке или один поток на одного клиента? Получает ли сервер в пуле потоков или у вас есть только один поток, принимающий сообщения от всех клиентов? Используете ли вы блокирующий ввод-вывод и т. Д. –