Это то, что я пробовал:Передача строки через java.nio каналы не работают правильно
Сервер:
import java.net.InetSocketAddress;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class JavaApplication12 {
public static void main(String[] args) throws Exception{
Charset charset = Charset.forName("ISO-8859-1");
ServerSocketChannel s = ServerSocketChannel.open();
s.configureBlocking(true);
s.socket().bind(new InetSocketAddress(1024));
CharBuffer c = CharBuffer.wrap("Hello from server!");
System.out.println("writing " + c);
ByteBuffer b = charset.encode(c);
SocketChannel sc = s.accept();
sc.configureBlocking(true);
b.flip();
int a = sc.write(b);
sc.close();
s.close();
System.out.println("wrote " + a);
}
}
Клиент:
import java.net.InetSocketAddress;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class JavaApplication11 {
public static void main(String[] args) throws Exception {
Charset charset = Charset.forName("ISO-8859-1");
SocketChannel sc = SocketChannel.open(new InetSocketAddress("127.0.0.1", 1024));
sc.configureBlocking(true);
ByteBuffer b = ByteBuffer.allocate(32);
b.flip();
int a = sc.read(b);
sc.close();
b.flip();
CharBuffer c = charset.decode(b);
c.flip();
System.out.println("Got " + c);
System.out.println("read " + a);
}
}
С другой стороны, кажется, просто получить очень длинная и пустая строка, и я не могу понять, что я делаю неправильно.
Обновление: Я обновил свой код и обнаружил, что сервер записывает 0 байт. Есть байты для записи, так почему же не sc.write()
ничего писать?
Update 2: С помощью Вишал в конце концов, мы имеем рабочий раствор:
Сервер:
Charset charset = Charset.forName("ISO-8859-1");
ServerSocketChannel s = ServerSocketChannel.open();
s.configureBlocking(true);
s.socket().bind(new InetSocketAddress(1024));
CharBuffer c = CharBuffer.wrap("Hello from server!");
ByteBuffer b = charset.encode(c);
SocketChannel sc = s.accept();
sc.configureBlocking(true);
b.compact();
b.flip();
int a = sc.write(b);
sc.close();
s.close();
System.out.println("wrote " + a);
Клиент:
Charset charset = Charset.forName("ISO-8859-1");
SocketChannel sc = SocketChannel.open(new InetSocketAddress("127.0.0.1", 1024));
sc.configureBlocking(true);
ByteBuffer b = ByteBuffer.allocate(32);
int a = sc.read(b);
sc.close();
b.flip();
CharBuffer c = charset.decode(b);
System.out.println("Got " + c);
Почему вы используете 'b.flip()' на стороне сервера перед отправкой данных клиенту? А также на стороне клиента перед чтением данных ...? –
Мое понимание заключается в том, что вы создаете 'ByteBuffer' или любой другой тип' Buffer', которые они запускают в режиме записи, поэтому вам нужно перевернуть их, чтобы поместить их в режим чтения. В противном случае я не понимаю все это правильно. – Logan