Java疑问:-------在Socket中用PrintWriter 写入的数据为什么用DataInputStream不能读取?
2015-08-06 15:54
701 查看
在Socket中用PrintWriter 写入的数据为什么用DataInputStream不能读取?
原因是什么???
其本质原因是什么???
:
/*
* 功能:是一个服务器,在9999端口上监听
* 可以通过控制台,输入会送给客户端的信息。
* 总共需要多少流???
* 1.把数据写入套接字流
* 2.从套接字中读取数据流
* 3.从控制台接收流
* 3.
*
*
* */
package com.test1;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.*;
import java.io.*;
public class MyServer2
{
public static void main(String[] args)
{
MyServer2 ms2=new MyServer2();
}
public MyServer2()
{
try {
// 提示
System.out.println("我正在9999监听。。。。");
// 在9999端口上监听
ServerSocket ss=new ServerSocket(9999);
// 等待连接
Socket s=ss.accept();
// 先接收客户端发来的信息
//InputStreamReader isr=new InputStreamReader(s.getInputStream());
DataInputStream dis=new DataInputStream(s.getInputStream());
//BufferedReader br=new BufferedReader(isr);
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
// 接收从控制台输入的信息
InputStreamReader isr2=new InputStreamReader(System.in);
BufferedReader br2=new BufferedReader(isr2);// 这个流是用于读取Socket连接的。
while(true)
{
//
//String infoFromClient=br.readLine();
//
//System.out.println("客户端发来:"+infoFromClient);
String get=
dis.readUTF();System.out.println("客户端发来:"+get);
//接收从控制台输入的信息
// 提示
System.out.println("输入你希望对客户端说的话");
String response =br2.readLine();
// 把从控制台接收的信息,写入套接字
pw.println(response);
//在Socket中用PrintWriter 写入的数据为什么用DataInputStream不能读取?
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.test1;
import java.net.*;
import java.io.*;
public class MyClient2
{
public static void main(String[] args)
{
MyClient2 mc2=new MyClient2();
}
public MyClient2()
{
try {
// 去连接服务器端
Socket s=new Socket("127.0.0.1",9999);
//PrintWriter pw=new PrintWriter(s.getOutputStream(),true); // 刚才估计是因为,这个true 没写,才造成:客户端发送的数据,服务器端无法接收。
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
//OutputStreamWriter osw=new OutputStreamWriter(dos);
//BufferedWriter bw=new BufferedWriter(osw);
// 客户端也需要一个流用于从控制台接收信息
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
// 再创建一个流,用以从套接字流中读出内容
/*InputStreamReader isr2=new InputStreamReader(s.getInputStream());
BufferedReader br2=new BufferedReader(isr2);这个可以正常读取*/
InputStreamReader isr2=new InputStreamReader(s.getInputStream());
BufferedReader br2=new BufferedReader(isr2);
// 现在修改,看看用DataInputStream能不能读取?
//DataInputStream dis=new DataInputStream(s.getInputStream());
while(true)
{
// System.out.println("请输入你想对服务器说的话");
// 客户端先从控制台接收
//String info =br.readLine();
//System.out.println("从控制台接收的话:"+info);// 这句话能执行,为什么dos.writeUTF()不能执行???
// 然后发送给服务器
//pw.println(info);
dos.writeUTF("你好啊!");
//dos.flush(); 我看看去掉,dos.flush()行不行? 事实证明:也可以
//bw.write(info);
/*dos.writeBytes(info);
dos.flush();这个也不行啊,究竟是为什么呢???*/
// 在这里将pw换成dos
//dos.writeChars(info);
这个也不行
//dos.writeUTF(info);// 看一下能正常通信不能?:经过验证,不能通信。
// 接收从服务器发来的话
/*这个可以正常读取,现在替换 String res=
br2.readLine();
System.out.println("服务器说:"+res);*/
/*String res=dis.readUTF();
System.out.println("用DataInputStream读取,服务器说:"+res);在Socket中用PrintWriter 写入的数据为什么用DataInputStream不能读取?*/
String res=
br2.readLine();
System.out.println("服务器说:"+res);
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
原因是什么???
其本质原因是什么???
:
/*
* 功能:是一个服务器,在9999端口上监听
* 可以通过控制台,输入会送给客户端的信息。
* 总共需要多少流???
* 1.把数据写入套接字流
* 2.从套接字中读取数据流
* 3.从控制台接收流
* 3.
*
*
* */
package com.test1;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.*;
import java.io.*;
public class MyServer2
{
public static void main(String[] args)
{
MyServer2 ms2=new MyServer2();
}
public MyServer2()
{
try {
// 提示
System.out.println("我正在9999监听。。。。");
// 在9999端口上监听
ServerSocket ss=new ServerSocket(9999);
// 等待连接
Socket s=ss.accept();
// 先接收客户端发来的信息
//InputStreamReader isr=new InputStreamReader(s.getInputStream());
DataInputStream dis=new DataInputStream(s.getInputStream());
//BufferedReader br=new BufferedReader(isr);
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
// 接收从控制台输入的信息
InputStreamReader isr2=new InputStreamReader(System.in);
BufferedReader br2=new BufferedReader(isr2);// 这个流是用于读取Socket连接的。
while(true)
{
//
//String infoFromClient=br.readLine();
//
//System.out.println("客户端发来:"+infoFromClient);
String get=
dis.readUTF();System.out.println("客户端发来:"+get);
//接收从控制台输入的信息
// 提示
System.out.println("输入你希望对客户端说的话");
String response =br2.readLine();
// 把从控制台接收的信息,写入套接字
pw.println(response);
//在Socket中用PrintWriter 写入的数据为什么用DataInputStream不能读取?
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.test1;
import java.net.*;
import java.io.*;
public class MyClient2
{
public static void main(String[] args)
{
MyClient2 mc2=new MyClient2();
}
public MyClient2()
{
try {
// 去连接服务器端
Socket s=new Socket("127.0.0.1",9999);
//PrintWriter pw=new PrintWriter(s.getOutputStream(),true); // 刚才估计是因为,这个true 没写,才造成:客户端发送的数据,服务器端无法接收。
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
//OutputStreamWriter osw=new OutputStreamWriter(dos);
//BufferedWriter bw=new BufferedWriter(osw);
// 客户端也需要一个流用于从控制台接收信息
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
// 再创建一个流,用以从套接字流中读出内容
/*InputStreamReader isr2=new InputStreamReader(s.getInputStream());
BufferedReader br2=new BufferedReader(isr2);这个可以正常读取*/
InputStreamReader isr2=new InputStreamReader(s.getInputStream());
BufferedReader br2=new BufferedReader(isr2);
// 现在修改,看看用DataInputStream能不能读取?
//DataInputStream dis=new DataInputStream(s.getInputStream());
while(true)
{
// System.out.println("请输入你想对服务器说的话");
// 客户端先从控制台接收
//String info =br.readLine();
//System.out.println("从控制台接收的话:"+info);// 这句话能执行,为什么dos.writeUTF()不能执行???
// 然后发送给服务器
//pw.println(info);
dos.writeUTF("你好啊!");
//dos.flush(); 我看看去掉,dos.flush()行不行? 事实证明:也可以
//bw.write(info);
/*dos.writeBytes(info);
dos.flush();这个也不行啊,究竟是为什么呢???*/
// 在这里将pw换成dos
//dos.writeChars(info);
这个也不行
//dos.writeUTF(info);// 看一下能正常通信不能?:经过验证,不能通信。
// 接收从服务器发来的话
/*这个可以正常读取,现在替换 String res=
br2.readLine();
System.out.println("服务器说:"+res);*/
/*String res=dis.readUTF();
System.out.println("用DataInputStream读取,服务器说:"+res);在Socket中用PrintWriter 写入的数据为什么用DataInputStream不能读取?*/
String res=
br2.readLine();
System.out.println("服务器说:"+res);
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
相关文章推荐
- java代码优化
- #笔记#圣思园 JavaWeb 第59讲——使用Firebug调试JS、JSUnit,XUnit
- Java Sleep() 与 Wait()的机制原理与区别
- 【@Transactional】Spring 之注解事务 @Transactional
- 线程安全与并发安全探究(四)-java集合框架
- java代码--汉诺塔
- java Method用法
- spring和java国际化资源文件加载顺序
- WSAD 如何修改JDK以使用jdk1.4
- [转]在Eclipse中使用JUnit4进行单元测试(中级篇)
- JNI的替代者—使用JNA访问Java外部功能接口
- java之类变量、成员变量、局部变量
- Java框架数据库连接池
- 在Eclipse中使用JUnit4进行单元测试(初级篇)
- Java异常的分类
- Java SE 6 新特性: Java DB 和 JDBC 4.0
- java.security.InvalidKeyException: Illegal key size
- Java SE 6 新特性: 对脚本语言的支持
- SpringMvc 返回值类型
- 自行集成极光推送所遇到的一个错误::java.lang.UnsatisfiedLinkError: