簡體   English   中英

如何在Java中創建請求-響應TCP ​​CProgram?

[英]How to create a request-response tcp cprogram in java?

我正在開發一個Java客戶端服務器程序,但是我很難創建一個tcp套接字,該套接字將收到一個又一個的消息,並在發出請求后立即分別響應每個消息。因為(-1)又名在接收套接字字節期間收到的終止分隔符是在套接字關閉之后出現的。

-我想達到的目標是(例如,暗示有圓錐形)
客戶>>“請求”
服務器>>“響應”
客戶>>“請求”
服務器>>“響應”
...等等

我該如何在JAVA中做到這一點? 每次發送和接收消息時都必須關閉和打開套接字連接嗎?

對不起,沒有整齊地解釋它! 先感謝您!!!

MyServer是服務器代碼

import java.io.*;  
import java.net.*;  

public class MyServer {  

    public static void main(String[] args) throws Exception{  

        ServerSocket ss=new ServerSocket(6666);  
        Socket s = ss.accept();//establishes connection    

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //BufferedWriter dout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        DataInputStream din = new DataInputStream(s.getInputStream());
        DataOutputStream dout = new DataOutputStream(s.getOutputStream());

        String str1 = "";
        String str2 = "";

        while(!str1.equals("stop")){

        str1 = din.readUTF();;
        System.out.println("Client: " + str1);

        str2 = br.readLine();

        dout.writeUTF(str2);
        dout.flush();

        }

        din.close();
        s.close();
        ss.close();

    }  
}

MyClient是客戶端代碼

import java.io.*;  
import java.net.*;  

public class MyClient {  

    public static void main(String[] args) throws Exception {  

        Socket s = new Socket("localhost",6666);  

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //BufferedReader din = new BufferedReader(new InputStreamReader(s.getInputStream()));
        DataInputStream din = new DataInputStream(s.getInputStream());
        DataOutputStream dout = new DataOutputStream(s.getOutputStream());

        String str1 = "";
        String str2 = "";
        while(!str1.equals("stop")){

        str1 = br.readLine();
        dout.writeUTF(str1);
        dout.flush();

        str2 = din.readUTF();
        System.out.println("Server: " + str2);

        }

        dout.close();
        s.close();  
    }  
} 

此代碼允許客戶端和服務器之間進行雙向通信。 可以通過從任何一側發送停止消息來停止通信。

並記住從客戶端發送第一條消息以開始交流

這是服務器多線程的示例:

服務器.java

import java.net.ServerSocket;
import java.net.Socket;

public class Server implements Runnable{



    private ServerSocket socket = null;
    private Socket sock = null;
    private boolean running = false;

    public Server(){
        try{
            socket = new ServerSocket(4444);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(!running){
            running = true;
            System.out.println("Server : UP");
            try{
                sock = socket.accept();
            }catch(Exception e){
                System.out.println("Errore durante l'attesa di nuove connessioni.");
                break;
            }
            ClientThread ct = new ClientThread(sock,this);
            Thread t = new Thread(ct);
            t.start();

            System.out.println("In attesa di connessioni...");

        }

    }

    public void stop(){
        if(running){
            running = false;
            System.out.println("Server : DOWN");
            try{
                socket.close();
            }catch(Exception e){
                e.printStackTrace();
                return;
            }
        }   
    }

    public boolean isRunning(){
        return running;
    }

}

ClientThread.java

package Server;

import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.NoSuchElementException;
import java.util.Scanner;

public class ClientThread implements Runnable{

    private Scanner scan;
    private PrintWriter pw;
    private Socket sock;
    private Server main_thread;
    private boolean flag = false;
    private boolean running = true;
    private SenderThread st = null;

    public ClientThread(Socket sock,Server server){
        this.sock = sock;
        this.main_thread = server;

    }

    @Override
    public void run() {
        if(flag)
            return;
        flag = true;
        try{
            scan = new Scanner(sock.getInputStream());
            pw = new PrintWriter(sock.getOutputStream());
        }catch(Exception e){
            e.printStackTrace();
        }

        while(running){
          try{
            String cmd = scan.nextLine();
            if(cmd.equals("Start")){
                st = new SenderThread(pw);
                Thread t = new Thread(st);
                t.start();
            }
            else if(cmd.equals("Stop")){
                st.stop();
            }
            else{
                running = false;
            }
          }catch(NoSuchElementException e){
              running = false;
              e.printStackTrace();
          }
        }

        try{
            sock.close();
            scan.close();
            pw.close();
        }catch(Exception e){
            e.printStackTrace();
        }

    }

}

偵聽器

package Client;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class Listener implements ActionListener{

    private GuiClient frame;
    private Socket socket;
    private Scanner scan;
    private PrintWriter pw;
    private Receiver receiver = null;

    public Listener(GuiClient gui){
        this.frame = gui;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        if(cmd.equals("Connect")){
            if(frame.ip_textfield.getText() == "" || frame.port_textfield.getText() == "" ){
                JOptionPane.showMessageDialog(null, "Dati insufficienti !!!");
            }
            String address = frame.ip_textfield.getText();
            int port = Integer.parseInt(frame.port_textfield.getText());
            try{
                setupConnection(address,port);
                frame.status_label.setText("SERVER UP");
            }catch(Exception e1){
                JOptionPane.showMessageDialog(null, "Impossibile stabilire una connessione con il server.");
                e1.printStackTrace();
            }
            frame.Start.setEnabled(true);
            frame.Connect.setEnabled(false);
            frame.Disconnect.setEnabled(true);
            frame.Stop.setEnabled(false);
        }else if(cmd.equals("Start")){
            //ricevi stringhe e mostrale a schermo
            frame.Start.setEnabled(false);
            frame.Stop.setEnabled(true);
            frame.Connect.setEnabled(false);
            frame.Disconnect.setEnabled(false);
            pw.println(cmd);
            pw.flush();
            try{
              receiver = new Receiver(frame.status_label,scan);
            }catch(Exception e2){
                JOptionPane.showMessageDialog(null, "Impossibile ricevere stringhe...");
                e2.printStackTrace();
            }
            System.out.println("Client : "+cmd);
            Thread t = new Thread(receiver);
            t.start();
        }else if(cmd.equals("Stop")){
            frame.Stop.setEnabled(false);
            frame.Disconnect.setEnabled(true);
            frame.Connect.setEnabled(false);
            frame.Start.setEnabled(true);
            try{
                pw.println(cmd);
                pw.flush();
                JOptionPane.showMessageDialog(null, "Ricezione delle stringhe interrotta.");
            }catch(Exception e1){
                e1.printStackTrace();
            }
        }else if(cmd.equals("Disconnect")){
            frame.Connect.setEnabled(true);
            frame.Disconnect.setEnabled(false);
            frame.Start.setEnabled(false);
            frame.Stop.setEnabled(false);
            try{
                socket.close();
            }catch(Exception e1){
                e1.printStackTrace();
            }
        }

    }

    private void setupConnection(String address, int port){
        try{
            socket = new Socket(address,port);
            OutputStream os = socket.getOutputStream();
            scan = new Scanner(socket.getInputStream());
            pw = new PrintWriter(os);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

偵聽器在gui客戶端后面工作; SenderThread和Receiver是可與字符串一起使用的其他Java類(在這種情況下),希望對您有所幫助。

暫無
暫無

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

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