簡體   English   中英

Java套接字:服務器如何從客戶端讀取多行

[英]Java socket: how the server can reads multiple lines from the client

我使用我遇到的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();
        }
    }

}

這是我從以前的帖子中復制和編輯的代碼。 問題是來自套接字的輸入流正在阻塞。 所以我的建議是在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();
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM