|
|
Виснет многопоточный Socket-Server.??:(
Здравств, идея проста сделать сервер для двух игроков и чтоб была возможность не только одним слушать порт. Тоисть многопоточный. Взял с туториалов стандартные примеры, но почему-то клиент виснет при чтении.
Виснет на этой строке
Код:
this.responseMessage = dataInputStream.readUTF();
Я не могу отдебажить сервер. Не срабатывают брейкпоинты... Гляньте где ошибка...
Запуск и коннект происходит, - смотрел с дебаггером.
А вот дальше ничего посмотреть не могу..
Вот два стандартных класса(пока что тестовый вариант).
Код:
package chess.network;
import java.io.IOException;
import java.net.ServerSocket;
public class ChessServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
boolean listening = true;
System.err.println("SERVER!: 4444.");
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.err.println("Could not listen on port: 4444.");
System.exit(-1);
}
while (listening) {
new ChessMultiServerThread(serverSocket.accept()).start();
}
serverSocket.close();
}
}
Код:
package chess.network;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ChessMultiServerThread extends Thread {
private Socket socket = null;
public ChessMultiServerThread(Socket socket) {
super("KKMultiServerThread");
this.socket = socket;
}
public void run() {
try {
System.out.println("Thred");
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("In Stream: "+in.toString());
out.write("To Client");
System.out.println("Out Stream: "+out.toString());
out.flush();
out.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
И вот мой тестовый клиент.
Код:
package chess.network;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class CHClient {
private Socket clientSocket;
private InputStream inputStream;
private OutputStream outputStream;
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
private final String hostName = "localhost";
private final int PORT = 4444;
private String requestMessage = null;
private String responseMessage = null;
public CHClient() {
System.out.println("-CLIENT-");
try {
this.clientSocket = new Socket(this.hostName, this.PORT);
this.inputStream = clientSocket.getInputStream();
this.outputStream = clientSocket.getOutputStream();
this.dataInputStream = new DataInputStream(inputStream);
this.dataOutputStream = new DataOutputStream(outputStream);
this.requestMessage = "Lallllaaaaaa";
sendMessage(this.requestMessage);
this.responseMessage = dataInputStream.readUTF();
System.out.println(this.responseMessage);
System.out.println("ClientStopped!");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
this.inputStream.close();
this.outputStream.close();
this.clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void sendMessage(String msg) {
try {
this.dataOutputStream.writeUTF(msg);
this.dataOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Спасибо.
|
Цитата:
Цитата Killer_13
но почему-то клиент виснет при чтении. »
|
у меня клиент срабатывает, но выпадает здесь
Код:
catch (IOException e)
{
}
проверяйте
DataInputStream
DataOutputStream
|
Цитата:
Цитата ferget
у меня клиент срабатывает, но выпадает здесь »
|
- дык соственно спрашиваю, что не так, смотрел, проверял. :( Спасибо что попробовали...
|
вот пример рабочего клиент сервера
сервер
Код:
package nserver;
import java.io.*;
import java.net.Socket;
public class ServerOne extends Thread
{
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public ServerOne(Socket s) throws IOException
{
socket = s;
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream())), true);
start();
}
@Override
public void run()
{
try
{
while (true)
{
String str = in.readLine();
if (str.equals("END"))
break;
System.out.println("Echoing: " + str);
out.println(str);
}
System.out.println("closing...");
}
catch (IOException e)
{
System.err.println("IO Exception");
}
finally
{
try
{
socket.close();
}
catch (IOException e)
{
System.err.println("Socket not closed");
}
}
}
}
Код:
package nserver;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class MServer {
static final int PORT = 8888;
public static void main(String[] args) throws IOException
{
ServerSocket s = new ServerSocket(PORT);
System.out.println("Server Started");
try
{
while (true)
{
Socket socket = s.accept();
try
{
ServerOne serverOne = new ServerOne(socket);
}
catch (IOException e)
{
socket.close();
}
}
}
finally
{
s.close();
}
}
}
клиент
Код:
package nserver;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException
{
int PORT = 8888;
InetAddress addr = InetAddress.getByName(null);
System.out.println("addr = " + addr);
Socket socket = new Socket(addr, PORT);
try
{
System.out.println("socket = " + socket);
BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
for (int i = 0; i < 10; i++)
{
out.println("HELLO " + i);
String str = in.readLine();
System.out.println(str);
}
out.println("BYE");
}
finally
{
System.out.println("closing...");
socket.close();
}
}
}
|
Спасиб, просмотрю, чем отличается от моего...
|
Еще раз спасибо, ваш пример работает. думаю вопрос решен
|
А еще вот вопрос по теме..
Как мне определять двух игроков на одну игру?
К примеру таков вариант возможен, или это делается как-то по другому?
Один игрок, создает сервер, а у другого например в комбобоксе он появляется, другой соответственно берет это имя из комбобокса, топчет на сервер и спрашивает у него, - эй у тебя есть клиент с таким соединением, если есть, то что?
Я мыслю в правильном направлении?
Спасибо.
|
Цитата:
Цитата Killer_13
Я мыслю в правильном направлении? »
|
не совсем понял ход мысли, но в простейшем случае должно быть так:
каждому одиночному серверу добавляется свойство имя, каждый клиент при подключении посылает свое имя
главный сервер содержит список всех имен и по запросу выдает кто подключен, если два клиента хотят играть, то для них создается игра
|
Время: 11:00.
© OSzone.net 2001-