Клиент подключается к серверу и затем входит в следующий цикл.
Он берет одну строку ввода с консоли, отправляет ее на сервер.
Если строка ввода представляет собой один символ «x», клиент завершает работу.
Сервер
Сначала он выводит собственный адрес сокета на экран. Когда он получает соединение, он выводит адрес сокета однорангового узла на экран (чтобы вы могли проверить, кто подключен к серверу), а затем входит в следующий цикл. Он получает строку сообщения от клиента, выводит полученное сообщение на экран.
Неблокирующий режим
Клиент должен использовать буферы и неблокирующий канал сокета.
Режим блокировки
Сервер должен использовать буферы и блокирующий канал сокета.
выпуск
Проблема, с которой я столкнулся, заключается в том, что буфер на стороне сервера не очищается и печатает старый ввод с новым вводом. Пример:
Сообщение получено: привет
Сообщение получено: helloworld
Сообщение получено: helloworldthis
Сообщение получено: helloworldthisis
Сообщение получено: helloworldthisis Edwin
И это должна быть печать: привет
мир
это
есть
Edwin.
Это код сервера:
public class EchoServer_1
{
// private static CharBuffer buffer = CharBuffer.allocate(1024);
private static ByteBuffer buffer = ByteBuffer.allocate(1024);
private static StringBuffer reqString = new StringBuffer();
public static void main(String[] args) throws IOException
{
ServerSocketChannel serverSocketChannel = null;
int serverPort = 10007;
try{
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress (serverPort));
//Blocking mode
serverSocketChannel.configureBlocking(true);
System.out.println("Port number: " + serverPort);
System.out.println("Waiting for connection ..");
SocketChannel sc = serverSocketChannel.accept();
System.out.println ("Incoming connection from: "
+ sc.socket().getRemoteSocketAddress( ));
// Read message from client
while (true)
{
buffer.clear();
sc.read(buffer);
buffer.flip();
while(buffer.hasRemaining()) {
char c = (char) buffer.get();
if (c == '\r' || c == '\n') break;
reqString.append(c);
}
log("Message received: " + reqString);
}
}catch (IOException ex)
{
if (serverSocketChannel != null)
serverSocketChannel.close();
System.err.println("Client has disconneted");
}
}
private static void log(String str) {
System.out.println(str);
}
}
Это исходный код клиента:
public class EchoClient_1
{
private static Scanner stdIn = new Scanner(System.in);
// private static CharBuffer buffer = CharBuffer.allocate(1024);
private static ByteBuffer buffer = ByteBuffer.allocate(256);
public static void main(String[] args) throws IOException
{
String hostname = new String ("127.0.0.1");
int port = 10007;
try{
InetSocketAddress address = new InetSocketAddress(hostname, port);
SocketChannel sC = SocketChannel.open(address);
sC.configureBlocking(false);
log("Local address: " + hostname + " connecting to Server on port " + port
+ "...");
String userInput;
System.out.println("Enter lines of characters: " );
while ((userInput = stdIn.nextLine()) != null)
{
//Checks if user wants to exit
if (userInput.equalsIgnoreCase("x"))
{
buffer.put (userInput.getBytes());
buffer.flip();
sC.write(buffer);
buffer.clear();
System.out.println("Closing ..");
sC.close();
break;
}
buffer.put (userInput.getBytes());
buffer.flip();
sC.write(buffer);
buffer.clear();
}
sC.close();
}catch (IOException ex)
{
}
}
private static void log(String str) {
System.out.println(str);
}
}