黑马程序员技术交流社区
标题:
求教,我真的不知道哪里错了!Tcp,socket输出输入流。
[打印本页]
作者:
王晓楠
时间:
2013-1-31 00:56
标题:
求教,我真的不知道哪里错了!Tcp,socket输出输入流。
客户端:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class CopyOfTransClient {
public static void main(String args[]) throws UnknownHostException,
IOException {
run();
}
public static void run() throws UnknownHostException, IOException {
// 连接服务端、获取客户端输出流。
Socket socket = new Socket("192.168.0.3", 10009);
BufferedWriter bwso = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
// 获取键盘录入。socket输出流输出。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// socket输入流。
BufferedReader brso = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String str = null;
while ((str = br.readLine()) != null) {
if (str.equals("over"))
break;
bwso.write(str);
bwso.flush();
// socket输入流。接受服务端的反馈。
String strso = brso.readLine();
System.out.println(strso);
bwso.close();
br.close();
}
}
}
复制代码
服务端:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class CopyOfTransServer {
public static void main(String args[]) throws IOException {
run();
}
public static void run() throws IOException {
// 获取连接过来的客户端。
ServerSocket serverSocket = new ServerSocket(10009);
Socket socket = serverSocket.accept();
//获取ip
String ip = socket.getInetAddress().getHostAddress();
System.out.println(ip);
// 获取客户端流对象。
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
String str = null;
while ((str = br.readLine()) != null) {
bw.write(str.toUpperCase());
}
serverSocket.close();
socket.close();
}
}
复制代码
作者:
王晓楠
时间:
2013-1-31 01:57
本帖最后由 王晓楠 于 2013-1-31 01:59 编辑
哎,谁知毕老师接下来讲的就是这个问题!3个错误!
1.客户端write()方法后要进行刷新flush(),因为要写入的数据只是到了write()方法的缓冲区,没有写入预期目标。
2.因为客户端在34行没有读到结束标记“\r\n”(这点可以从毕老师讲的readLine()方法原理可以知道),刷新后,服务端就在33行读,它读到了数据,但就是等不到结束标记,因为她是readLine()方法,他就一直等。造成了阻塞。所以,客户端在write()要加“\r\n”,服务端也要在write()加“\r\n”(因为客户端读取用的也是readLine()方法).
3.客户端43、44行的输出输入流不应该关。要关也应该在while循环外关。客户端也应该在while循环外关!
作者:
胡发友
时间:
2013-1-31 10:08
一、客户端
1、的输出流brso,应加newLine方法,因为flush和newLine方法一般都是一起使用;
作者:
胡发友
时间:
2013-1-31 10:09
2、关流动作应在循环外
作者:
胡发友
时间:
2013-1-31 10:40
这样写:
import java.io.*;
import java.net.*;
class Client
{
public static void main(String [] args)throws IOException
{
Socket s = new Socket("192.168.2.109",10002);
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufOut =
new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while((line = bufr.readLine()) != null)
{
if("over".equals(line))
break;
bufOut.write(line);
bufOut.newLine();
bufOut.flush();
String str = bufIn.readLine();
System.out.println(str);
}
bufr.close();
s.close();
}
}
class Server
{
public static void main(String [] args)throws IOException
{
ServerSocket ss = new ServerSocket(10002);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + "connected...");
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bufOut =
new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while((line = bufIn.readLine()) != null)
{
bufOut.write(line.toUpperCase());
bufOut.newLine();
bufOut.flush();
}
ss.close();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2