发现一个问题
Socket编程中要慎用
PrintStream和PrintWriter,首先创建时要注意加上 true,自动flush,否则数据无法发送出去,
其次它们的println()要用它们的readLine来读取,如果你用用DataInputStream.readUTF读取将导致阻塞,一直都读取不到数据,见下面代码就是。
package com.chat.server.io;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server
{
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
InputStream is = null;
DataInputStream dis = null;
OutputStream os = null;
// DataOutputStream dos = null;
PrintStream pos = null;
ServerSocket ss = new ServerSocket(10001);
try
{
while(true)
{
Socket soc = ss.accept();
is = soc.getInputStream();
dis = new DataInputStream(is);
os = soc.getOutputStream();
// dos = new DataOutputStream(os);
pos = new PrintStream(os,true);
try
{
InetAddress clientAddr = soc.getInetAddress();
String str = "欢迎客户" + clientAddr + "到访,该客户占用端口"
+ soc.getPort() ;
pos.print(str+"\r\n\n");
//pos.flush();
//dos.writeUTF(str);
// dos.flush();
str = dis.readUTF();
while (!"quit".equals(str))
{
System.out.println("client said:" + str);
str = dis.readUTF();
}
System.out.println(clientAddr + " leave");
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
is.close();
os.close();
soc.close();
}
}
}
finally
{
if(ss != null){
ss.close();
}
}
}
}
package com.chat.server.io;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
public class Client
{
public static void initArray(byte[] arr)
{
Arrays.fill(arr, (byte)0);
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
InputStream is = null;
DataInputStream dis = null;
OutputStream os = null;
DataOutputStream dos = null;
Socket soc = new Socket();
InetAddress address = InetAddress.getLocalHost();
InetSocketAddress endpoint = new InetSocketAddress(address,10001);
soc.connect(endpoint);
byte bmsg[] = new byte[1024];
initArray(bmsg);
String msg = null;
try
{
is = soc.getInputStream();
dis = new DataInputStream(is);
os = soc.getOutputStream();
dos = new DataOutputStream(os);
String str = dis.readLine();
//String str = dis.readUTF();
System.out.println("Server said:"+ str);
int num = System.in.read(bmsg);
msg = new String(bmsg,0,num);
msg = msg.substring(0,msg.length() -2);
while(!"quit".equals(msg))
{
dos.writeUTF(msg);
dos.flush();
num = System.in.read(bmsg);
msg = new String(bmsg,0,num);
msg = msg.substring(0,msg.length() -2);
}
dos.writeUTF(msg);
dos.flush();
}
finally
{
if(soc != null)
{
soc.close();
}
}
}
}
如果Client中的dis.readLine改成dis.readUTF,则会在dis.readUTF一直阻塞。
分享到:
相关推荐
java 输出流中的PrintStream 和 PrintWriter有什么区别
主要介绍了浅谈PrintStream和PrintWriter的区别和联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了PrintStream和PrintWriter的区别简介,具有一定借鉴价值,需要的朋友可以参考下
PrintStream,StringBuilder,Formatter
PrintStream 是打印输出流,它继承于FilterOutputStream。...它产生的IOException会被自身的函数所捕获并设置错误标记, 用户可以通过 checkError() 返回错误标记,从而查看PrintStream内部是否产生了IOException。
实验报告 实验一 Socket编程 一、实验目的 通过socket程序的编写、调试,掌握socket编程的基本方法,了解客户端与服务器端的特点,掌握并熟悉运用socket类与ServerSocket类。 实验内容 学习socket编程使用的类和接口...
PrintStream 是打印输出流,它继承于FilterOutputStream。接下来通过本文给大家介绍Java 中的Printstream,需要的朋友参考下吧
java学习笔记--PrintStream分享.pdf
PrintStream的用法2---马克-to-win java视频
PrintStream的用法1---马克-to-win java视频的详细描述与介绍
PrintStream ps = new PrintStream(s.getOutputStream()); /* 产生发消息的时刻 */ Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); /* 向客户端发消息,消息...
对于不同数据类型的数据进行输入输出练习。过程中使用导入Scanner包,Scanner中创建Scanner类型的变量,内容详细易懂,适合Java新手练习
Java代码实现时间服务器,让客户端设备通过服务器校准和获取最新的时间,和Windows时间自动更新的功能类似。 int port=13; //端口号 ServerSocket serverSocket; //服务器套接字 public TimeServer(){ ...
PrintStream和PrintWriter 日期与时间 基本概念 Date和Calendar LocalDateTime ZonedDateTime DateTimeFormatter Instant 最佳实践 单元测试 编写JUnit测试 使用Fixture 异常测试 条件测试 参数化测试
/* Constructor needs max Number of Threads and PrintStream to print messages to (or null). */ Pool pool = new Pool ( 1 , System . out); Runnable exampleRun = new Runnable () { @O
这是用Java创建一个简单的时间服务器的... PrintStream out=new PrintStream(client.getOutputStream()); //得到输出流 Date now=new Date(); //获取当前时间 out.println(now); //输出当前时间到客户端 }
目 录 1剪刀石头布游戏设计思路阐述2 2程序概要设计2 2.1功能需求分析2 2.2性能需求分析2 2.3程序框图3 2.4 JAVA类及自定义类相互继承的层次关系3 2.4.1 Java类及自定义类的说明3 2.4.2类中成员及作用4 String data...
C) 在show()方法中无法调用父类的print()方法。 D) 在show()方法中可以为day进行赋值,因为Test2继承了Test,则在Test2中也继承了父类的day变量。 题目13: 下面哪个关键字,使类不能在被其他的类继承?c...
w我们在进行java学习中经常遇到各种错误,对大家来说谅解调试过程中的错误能够加快我们的调试进度!
File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。 9....