`
watershitter
  • 浏览: 43072 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java socket-客户端接收不到服务端口消息问题原因

阅读更多
初步尝试了解下socket编程,结果被一个问题困扰了一天,回想真是失败~总结原因
1 明显的java功底太弱,对各种类的了解不彻底深入
2 解决问题的方法不够理性,系统~

陈述问题,最简单的情况,单线程交互,问题代码如下:
server:
package sl.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class BugServer {
	
	public static void main(String[] args) {
		ServerSocket ss = null;
		try {
			ss = new ServerSocket(10000);
			System.out.println("server start...");
			while(true){
				Socket socket = ss.accept();
				System.out.println("a client come in :"+socket.toString());
				
				BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				//注意:if true, the println, printf, or format methods will flush the output buffer
				//即使autoflush了,也只对三个方法有效!
				PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
				
				
				//若客户段没有使用autoflush方法,服务段将阻塞在这一行
				System.out.println(in.readLine());
				//问题出在这里,调用的不是autoflush的方法,即使后面有 pw.flush() 也不行!
				pw.println("服务端反馈! to "+ socket.toString());
				pw.flush();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				ss.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}


client:
package sl.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class BugClient {
	Socket soc;
	
	public static void main(String[] args){
		new BugClient().send();
	}

	private void send() {
		try {
			soc = new Socket("127.0.0.1",10000);
			PrintWriter socOut = new PrintWriter(soc.getOutputStream(),true);
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			BufferedReader netIn = new BufferedReader(new InputStreamReader(soc.getInputStream()));
			
			String line = in.readLine();
			System.out.println("input: "+line);
			// 若使用了非 autoflush方式,即使显示flush的话,更是连服务端都收不到消息!
			
			//由于消息没有"立即"传输到服务端, 会使得server在 阻塞在 in.readline()那一行.
			socOut.print(line);
			socOut.flush();
			
			//若将此行注释掉,即客户段放弃接收服务段消息,
			//那么这个客户段程序可以跑完,服务端将接收到消息,造成 socOut.flush()好像立即起了作用的假像
			//实际上,并不是 flush()那行代码起了作用,而是程序结束时,对 out流做清理工作,使得消息最终发送了过去
			/**
			 * 启用一下两行代码,由于 服务段已经被阻塞了,更别说响应,则客户段将阻塞在 netIn.readline();
			 */
			System.out.println(netIn.readLine());
			
			soc.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


就这样一个问题困扰了我一天,虽然最终发现了问题所在,也可以解决问题,但是理解上还没有透彻。
依然的困惑:
1 流的传输中flush的机制到底是怎样的,为什么显示的调用flush()都没有效果,又为什么放弃了客户段接收信息,程序结束时,消息最终还是传向了服务端?
2 socket的内部机制,在javaeye看帖时看到一句话,算是识记了这个知识,但不理解
  “Socket的发送与接收是需要同步进行的,即客户端发送一条信息,服务器必需先接收这条信息,  而后才可以向客户端发送信息,否则将会有运行时出错。

感叹一些自己的java如此单薄~

[size=medium]今天又看了一些资料,发现以上理解全部错了~ 阻塞的真正原因是因为 readline()一直在寻找 换行符号"\n",而根本就不是flush的原因![/size]
分享到:
评论

相关推荐

    java Socket实现聊天程序

    接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人...

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java聊天室的设计与实现socket 设计软件源码+WORD毕业论文文档.zip

    服务端的工作主要是来监听和接收来自客户端的请求,然后处理客户端发来的消息,并通知客户端。而客户端的功能是能够让新用户注册,通过用户名密码登陆并且使用该系统。通过服务端和客户端的协同工作最终使用户能够...

    java源码包3

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包4

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    基于Java实现de UDP数据传输,双向传输,接收端和发送端,服务器

    UDP是面向非连接的,UDP传输的是数据报只负责传输信息,不保证信息一定收到,虽然安全性不如TCP(面向连接、用Socket进行通信),但是性能较好。 从简单到复杂,首先简单介绍一下怎么利用UDP实现客服端发送消息给...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例 Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式 //给客户发一个感谢...

    java源码包2

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    分布式实验报告Socket.docx

    在服务器端,使用 DatagramSocket 创建一个数据包套接字,并将其绑定到指定的端口,然后使用 receive 方法接收数据包。 知识点四:并行编程的应用 在实验中,还讨论了并行编程的应用。在客户端和服务器端都可以使用...

    java jdk实列宝典 光盘源代码

    telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; UDP编程,包括收发udp报文; 聊天室服务器端,Chatserver.java;聊天室客户端,...

    实验三Socket通信实验报告.doc

    具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到; 3. 具有广播功能,客户端能够向所有其他成员广播消息; (3)编程语言和环境 1. 编程语言C/C++/C#/Java等均可; 2. 编程环境Windows...

    Java聊天室程序源码(毕业设计)

    接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例 Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式 //给客户发一个感谢...

    java课程设计---局域网聊天程序的设计与实现.doc

    其目的在于通过实践加深学生对面向对象程序 " "设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方 " "法,提高运用面向对象知识分析实际问题、解决实际问题的能力。 " "2.课程设计任务...

    Java聊天室程序(源代码)

    接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人...

    聊天的终端和服务器.txt

    设服务器端程序监听端口为8629, 当收到客户端信息后,首先判断是否是"BYE",若是,则立即向对方发送"BYE",然后关闭监听,结束程序。若不是,则在屏幕上输出收到的信息,并由键盘上输入发送到对方的应答信息。请编写...

    c#编写的基于Socket的异步通信系统封装DLL--SanNiuSignal.DLL

    SanNiuSignal是一个基于异步socket的完全免费DLL;它里面封装了Client,Server以及UDP;有了这个DLL;用户不用去关心心跳;粘包 ;组包;发送文件等繁琐的事情;大家只要简单的几步就能实现强大的通信系统;能帮助到...

    基于Java的视频会议系统(软件程序+WORD论文文档).zip

    服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。 数据在Internet中是以有限大小的包形式传输的,...

Global site tag (gtag.js) - Google Analytics