首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

流读取的有关问题

2013-08-16 
流读取的问题。第一个例子(这个例子,说明我的这个读取方法没错)package com.shengsiyuan.network.e3import

流读取的问题。
第一个例子(这个例子,说明我的这个读取方法没错)


package com.shengsiyuan.network.e3;

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 监听端
 */
public class ServerTest1
{
private static ServerSocket serverSocket;

public static void main(String[] args) throws Exception
{
serverSocket = new ServerSocket(5000);
Socket socket = serverSocket.accept();

InputStream is = socket.getInputStream();

byte[] buffer = new byte[200];
int length = 0;
String string = null;
while (-1 != (length = is.read(buffer, 0, buffer.length)))
{
string = new String(buffer, 0, length);
}
is.close();

socket.close();
serverSocket.close();

System.out.println(string);
}
}



package com.shengsiyuan.network.e3;

import java.io.OutputStream;
import java.net.Socket;

/**
 * 发送字符串welcome
 */
public class ClientTest1
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("localhost", 5000);

OutputStream os=socket.getOutputStream();
os.write("welcome".getBytes());
os.close();

socket.close();
}
}



server端可以输出字符串welcome


然后就是在此基础上,实现客户端和服务端的双向通讯。问题就来了


package com.shengsiyuan.network.e2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MainServer
{
private static ServerSocket serverSocket;

public static void main(String[] args) throws Exception
{
serverSocket = new ServerSocket(4000);

while (true)
{
Socket socket = serverSocket.accept();

// 启动读写线程
new ServerInputThread(socket).start();
new ServerOutputThread(socket).start();
}
}
}

class ServerInputThread extends Thread
{
private Socket socket;



public ServerInputThread(Socket socket)
{
this.socket = socket;
}

@Override
public void run()
{
try
{
InputStream is = socket.getInputStream();

while (true)
{
byte[] buffer = new byte[1024];
int length = is.read(buffer);
String str = new String(buffer, 0, length);
System.out.println(str);

// 不知道为什么这样读行不通
// byte[] buffer = new byte[1024];
// int length = 0;
// String str = null;
// while (-1 != (length = is.read(buffer, 0, buffer.length)))
// {
// str = new String(buffer, 0, length);
// }
// System.out.println(str);
}
}
catch (IOException e)
{
e.printStackTrace();
}

}
}

class ServerOutputThread extends Thread
{
private Socket socket;

public ServerOutputThread(Socket socket)
{
this.socket = socket;
}

@Override
public void run()
{
try
{
OutputStream os = socket.getOutputStream();

while (true)
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
os.write(line.getBytes());
}
}
catch (IOException e)
{
e.printStackTrace();
}

}
}



package com.shengsiyuan.network.e2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class MainClient
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("localhost", 4000);

new ClientInputThread(socket).start();
new ClientOutputThread(socket).start();
}
}

class ClientOutputThread extends Thread
{
private Socket socket;

public ClientOutputThread(Socket socket)
{
this.socket = socket;
}

@Override
public void run()
{
try
{
OutputStream os = socket.getOutputStream();
boolean flag = true;



while (flag)
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
os.write(line.getBytes());

if ("false".equals(line))
{
flag = false;
}
}
}
catch (IOException e)
{
e.printStackTrace();
}

}
}

class ClientInputThread extends Thread
{
private Socket socket;

public ClientInputThread(Socket socket)
{
this.socket = socket;
}

@Override
public void run()
{
try
{
InputStream is = socket.getInputStream();
boolean flag = true;

while (flag)
{
byte[] buffer = new byte[1024];

int length = is.read(buffer);

String str = new String(buffer, 0, length);

System.out.println(str);

if ("false".equals(str))
{
flag = false;
}
}
}
catch (IOException e)
{
e.printStackTrace();
}

}
}



注释哪里,换带注释的代码就不行,没明白,要是不能那样读的话,流内容一旦超过byte[]的长度就废了不是,请支招! 网络流 buffer socket io 多线程
[解决办法]
一次读取完了,就跳出循环了,就不会接收下一次socket流了。
[解决办法]
试了一下,如果byte[] buffer = new byte[2];在客户端输入22222的话,服务器那边的读取while读取循环会执行3次,读取的分别为22  22  2。
我觉得可以在每次发送信息的头尾加个特殊符号,对while读取的信息进行校验,把有特殊符号匹配的拼接成一个完整的信息,在显示出来。

热点排行