簡體   English   中英

Java套接字:我的服務器輸入流不會從客戶端輸出流中讀取?

[英]Java Sockets: My server input stream will not read from the client output stream?

編輯:我很長,但有誰知道如何編程套接字?

我的問題讓我有些困惑。 我有一台服務器在一台計算機上運行而在另一台計算機上運行,​​我有一個客戶端連接到它。 當我從客戶端鍵入消息到控制台並發送它時,服務器似乎沒有收到它。 任何人都知道為什么,因為我在過去的3個小時里一直在測試打印到控制台,並且無法解決這個問題。 我對套接字比較新,所以如果我只是個白痴,不要太苛刻。

繼承了我的客戶端代碼:

import java.net.*;
import java.util.Scanner;
import java.io.*;

public class SocketClient {

public static void main(String [] args) {
    String host = "************";
    int port = 25565;

    StringBuffer instr = new StringBuffer();
    String TimeStamp;
    System.out.println("SocketClient initialized");

    try {
        InetAddress address = InetAddress.getByName(host);
        Socket connection = new Socket(address, port);

        BufferedOutputStream bos = new     BufferedOutputStream(connection.getOutputStream());
        OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII");

        Scanner scan = new Scanner(System.in);
        String message = scan.nextLine();

        TimeStamp = new java.util.Date().toString();
        String process = "Server called on " + host + ":" + port + " at " + TimeStamp + ": " + message + (char) 13;

        osw.write(process);
        osw.flush();

        BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());

        InputStreamReader isr = new InputStreamReader(bis, "US-ASCII");

        int c;
        while ( (c = isr.read()) != 13)
            instr.append( (char) c);

        connection.close();
        System.out.println(instr);

    } catch (UnknownHostException e) {
        System.err.println("UnknownHostException: " + e);
    } catch (IOException e) {
        System.err.println("IOExcepion: " + e);
    }
}
}

以下是將客戶端連接到服務器的代碼:

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

public class MultipleSocketServer {

public static Socket connection;
public static String name = "Tyler's Server";
public static int limit = 2;
public static Thread[] clients = new Thread[limit];
public static int current = 0;
public static int port = 25565;
public static String[] connected = {"", ""};
public static ServerSocket socket;

public static void main(String[] args) {
    System.out.println("Server starting...");
    try {
        ServerSocket socket = new ServerSocket(port);
        while(true) {
            Socket connection = socket.accept();
            String ip = connection.getRemoteSocketAddress().toString().substring(1, 13);
            loop:
            for(int i = 0; i < connected.length; i++) {
                if(connected[0].equals(ip) || connected[1].equals(ip)) {
                    break loop;
                }else if(!connected[i].equals(ip)) {
                    connected[i] = ip;
                    System.out.println(ip);
                    MultiServer_Client client = new     MultiServer_Client(connection, i);
                    Thread run = new Thread(client);
                    run.start();
                    break loop;
                }
            }
        }
    } catch (IOException e1) {
        System.out.println("Could not bind server on: " + port);
        System.exit(-1);
    }
}
}

這是我的代碼處理每個客戶端連接:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class MultiServer_Client implements Runnable {

public String time;
public Socket client;
public StringBuffer process = new StringBuffer();

public BufferedInputStream inputStream;
public InputStreamReader reader;

public BufferedOutputStream outputStream;
public OutputStreamWriter writer;

public boolean connected = true;

public int ID;

public MultiServer_Client(Socket connection, int i) {
    client = connection;
    ID = i;
    try {
        inputStream = new BufferedInputStream(client.getInputStream());
        reader = new InputStreamReader(inputStream);

        outputStream = new BufferedOutputStream(client.getOutputStream());
        writer = new OutputStreamWriter(outputStream, "US-ASCII");
    } catch (IOException e) {
        System.out.println("IOException: " + e);
    }
    System.out.println("Client connected...");
    write("Connected to " + MultipleSocketServer.name);
}

public void run() {
    while(connected) {
        write("hi");
    }
    System.out.println("Disconnecting client...");
}

public void write(String authen) {
    try {
        time = new java.util.Date().toString();
        String message = time + ": " + authen + (char) 13;
        writer.write(message);
        writer.flush();
    } catch (IOException e) {
        connected = false;
        MultipleSocketServer.connected[ID] = "";
    }
}

public void read() {
    //read from client
    int character;
    process = new StringBuffer();
    try {
        while ((character = reader.read()) != 13) {
            process.append((char) character);
        }
        System.out.println(process);
        process.delete(0, process.length());
    } catch (IOException e) {
        connected = false;
        MultipleSocketServer.connected[ID] = "";
    }
}
}

如果我不能幫助Srry。 正如我所說,我是套接字的新手,沒有其他人似乎對此有任何問題...謝謝:)

您的代碼的問題不是它的通信協議的“套接字”。 在服務器有機會寫出“hi”之前,您正在有效地關閉套接字。

要調試它,您希望降低程序的復雜性。 在您的計划中,有許多事情沒有任何意義或問題。

所以,關於套接字的一點背景知識。 有兩種類型的套接字。 “ServerSocket”和“Socket”ServerSocket有點像秘書。 它唯一的工作是聽取呼叫,然后傳遞它們。 這就是“接受”的作用。 在任何客戶端連接之前,accept()將阻塞,直到它收到連接。 客戶端連接后,accept返回表示連接的Socket。

常規Socket是所有工作發生的地方。 您可以將其視為電話連接。 您可以使用OutputStream遠程與某人通話,並使用InputStream進行偵聽。 挑戰在於您需要為兩個套接字創建某種通信(稱為協議)以進行通信。

您需要弄清楚如何划分命令。 如果你想要一個“長度”分隔的協議,你可以傳遞一個固定長度的數字然后傳遞數據,或者你可以在消息的末尾使用一個特殊的字符(你現在擁有的)。 對於快速和臟,我經常使用后者與換行符。 最簡單的方法是使用PrintWriter進行書寫,使用Scanner進行閱讀。

下一步是找出客戶端和服務器的通信模式。 想想它是否來回傳球。 如果客戶說了什么,另一方應該是傾聽(反之亦然)。

一旦找到協議和邏輯,您就可以將用於“處理”服務器端的邏輯移動到單獨的線程(稱為工作模式)中,以便服務器一次可以處理多個客戶端。 如果你想更進一步,你可以實現一個帶有線程池的反應器,這樣服務器就不會用完線程,但這可能是另一天/問題。

我建議遵循套接字上的Java教程: http//docs.oracle.com/javase/tutorial/networking/sockets/index.html

暫無
暫無

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

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