Java_Socket简单通信

原创 2015年05月30日 18:30:04

这里主要是想说PrintWriter的write方法和println的区别  我被坑了2小时 

一开始使用的是write和flush方法 我看了看源码  write方法是不会刷新缓存的 使用flush方法 即可刷新缓存  但是此种组合在服务端像输出流写是没有问题的

                             但是如果在客户端 使用write和flush的组合  居然不起作用  效果就是客户端和服务器都在读取那里阻塞 还没找到原因 所以在客户端改为了println方法

其实println方法 就是调用了print和println两个方法 最终调用了newline方法  输出行标示符 和刷新缓存

 private void newLine() {
	try {
	    synchronized (lock) {
		ensureOpen();
		out.write(lineSeparator);
		if (autoFlush)
		    out.flush();
	    }
	}

看到这 那么手动输出换行是不是也是可以啊  所以可以使用

writer.write(str);

writer.write("\n");

write.flush();         和 writer.println(str);   方法是等效的


服务端

package com.undergrowth.reactor;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

public class SocketServerUnder implements Runnable{
	
	
	
	private ServerSocket serverSocket;
	public SocketServerUnder(SocketAddress address) throws IOException{
		serverSocket=new ServerSocket();
		serverSocket.bind(address);
	}
	
	public Socket getSocket() throws IOException
	{
		System.out.println("等待客户端连接");
		return serverSocket.accept();
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true){
			try {
				Socket socket=getSocket();
				System.out.println("客户端已连接");
				//System.out.println(socket.getLocalAddress().getHostAddress()+"\t"+socket.getLocalPort());
				new SocketServerHandler(socket);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}

	
}


服务端处理

package com.undergrowth.reactor;

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

public class SocketServerHandler extends Thread {

	private Socket socket;

	public SocketServerHandler(Socket socket) {
		// TODO Auto-generated constructor stub
		this.socket = socket;
		this.start();
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub

		try {
			dealInputStream(socket);
			dealOutputStream(socket);
			close(socket);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 会写给客户端的信息
	 * 
	 * @param socket2
	 * @throws IOException
	 */
	private void dealOutputStream(Socket socket2) throws IOException {
		// TODO Auto-generated method stub
		System.out.println("处理服务器端回写客户端的消息");
		OutputStream osOutputStream = socket2.getOutputStream();
		if (osOutputStream != null) {
			PrintWriter writer = new PrintWriter(osOutputStream, true);
			// 如果使用write方法 需要调用flush方法 但是有时不起作用 客户端和服务器端还是无法接受到消息的内容
			// 还是使用println
			writer.println("服务器已收到客户端信息");
			writer.flush();
		} else {
			throw new IOException("获取服务端的输出流为空");
		}
	}

	private void dealInputStream(Socket socket) throws IOException {
		System.out.println("处理服务器端读取客户端的消息");
		InputStream inputStream = socket.getInputStream();
		// System.out.println(inputStream);
		if (inputStream != null) {
			// 读完客户端发送的数据 将数据会写给客户端
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					inputStream));
			String s;
			// while(true)
			{
				s = reader.readLine();
				// if(s!=null&&s.equals("结束")) break;
				// if(s!=null) System.out.println(s);
				System.out.println(s);
			}
			System.out.println("结束服务器端读取客户端信息");
		} else {
			throw new IOException("获取服务端的输入流为空");
		}
	}

	private void close(Socket socket) throws IOException {
		if (!socket.isClosed()) {
			System.out.println("处理客户端关闭服务端的连接");
			if (!socket.isClosed() && !socket.isInputShutdown())
				socket.getInputStream().close();
			if (!socket.isClosed() && !socket.isOutputShutdown())
				socket.getOutputStream().close();
			if (!socket.isClosed())
				socket.close();
		}

	}

}


客户端

package com.undergrowth.reactor;

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

public class SocketClientUnder {
	
	private Socket socket;
	
	public Socket getSocket() {
		return socket;
	}

	public SocketClientUnder(String ip,int port) throws IOException{
		socket=new Socket(InetAddress.getLocalHost(), 6666);
	}
	
	public InputStream getInputStream() throws IOException{
		return socket.getInputStream();
	}
	
	public OutputStream getOutputStream() throws IOException{
		return socket.getOutputStream();
	}
	
	public void write(String str) throws IOException{
		System.out.println("处理客户端回写服务端的消息");
		OutputStream osOutputStream=getOutputStream();
		if(osOutputStream!=null){
			PrintWriter writer=new PrintWriter(osOutputStream,true);
			//如果使用write方法 需要调用flush方法  但是有时不起作用 客户端和服务器端还是无法接受到消息的内容
			//还是使用println
			writer.println(str);
			writer.flush();
			System.out.println("写完客户端回写服务端的消息");
		}else {
			throw new IOException("获取客户端的输出流为空");
		}
	}
	
	public void read() throws IOException {
		System.out.println("处理客户端读取服务端的消息");
		InputStream inputStream=getInputStream();
		if(inputStream!=null){
			//读完客户端发送的数据 将数据会写给客户端
			BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
			String s;
			//while(true){
				s=reader.readLine();
				//if(s!=null&&s.equals("结束")) break;
				//if(s!=null) System.out.println(s);
				System.out.println(s);
			//}
			System.out.println("结束客户器端读取服务端信息");
		}else {
			throw new IOException("获取客户端的输入流为空");
		}
	}
	
	public void close() throws IOException
	{
		if(!socket.isClosed()){
			System.out.println("处理客户端关闭服务端的连接");
			if(!socket.isClosed()&&!socket.isInputShutdown()) socket.getInputStream().close();
			if(!socket.isClosed()&&!socket.isOutputShutdown()) socket.getOutputStream().close();
			if(!socket.isClosed()) socket.close();
		}
	}
}

测试代码

package com.undergrowth.reactor;

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;

public class SocketTest {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		SocketAddress address=new InetSocketAddress(InetAddress.getLocalHost(), 6666);
		SocketServerUnder serverUnder=new SocketServerUnder(address);
		//服务器端等待
		new Thread(serverUnder).start();
		//System.out.println(InetAddress.getLocalHost().getHostAddress());
		//客户端连接
		SocketClientUnder socketClient=new SocketClientUnder(InetAddress.getLocalHost().getHostAddress(),6666);
		//System.out.println("客户端连接");
		//socketClient.getSocket().connect(address);
		//System.out.println("客户端连接");
		//for(int i=0;i<10;i++)
		socketClient.write("来自客户端的信息");
		//socketClient.write("来自客户端的信息2");
		//socketClient.write("结束");
		socketClient.read();
		socketClient.close();
	}

}



版权声明:本文为博主原创文章,未经博主允许不得转载。

Collection、List、Set、Map关系图学习笔记1

用PD画了一张相关接口、相关类及主要方法的图 帮助加深理解与记忆 接着对主要类 做了个简单的测试 更多的测试与学习 后续后补上 /** * */ pa...

socket ( java ) 简单多个客户端、服务端通信(多线程)

原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处  、作者信息和本声明。否则将追究法律责任。 http://blog.csdn.net/love254443233/articl...

一个简单的java socket通信程序

server端: package com.cskgnt.socket; import java.io.*; import java.net.*; import java.util.ArrayLis...
  • cskgnt
  • cskgnt
  • 2012年12月01日 16:52
  • 418

Java简单实现Socket非阻塞通信

用java实现socket C/S通信很简单,很多教科书上都有。但是这些通信模型大都是阻塞式的,其弊端也很明显:一方必须要接收的到对方的消息后,才能编辑自己的消息发出。同样对方也要一直等待这条消息收到...

Java Socket编程,一个完整的简单通信示例

第一步 充分理解Socket    1.什么是socket    所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发...

Java用socket实现简单的一对一通信

本人也是一个初涉及编程的小白,今天尝试用socket编写一个类似与QQ的聊天窗口,分为客户端和服务器端,然后通过socket来通讯,废话不多说直接上代码: 首先是客户端: Client.jav...

Flex和java的socket通信(四)一个简单的聊天室

知识点:消息广播者类名为Bmanager,他继承了Vector类 class Bmanager extends Vector {     Bmanager(){} void add(Sock...

java nio socket通信简单入门示例

基本的Java套接字对于小规模系统可以很好地运行,但当涉及到要同时处理上千个客户端的服务器时,可能就会产生一些问题.由于创建、维护和切换线程需要的系统开销,一客户一线程方式在系统扩展性方面受到了限制。...
  • zxdfc
  • zxdfc
  • 2015年11月22日 12:11
  • 352

java实现简单的Socket通信

java Socket 编程 数据发送的过程: 1:产生Socket; 2:调用bind的信息,通知给驱动程序 3:应用程序将要发送的数据传送给Socket 4: 驱动从Socket 取出数...

linux下java程序与C语言程序通过SOCKET通信的简单例子

本例中C语言端作为服务器,java端作为客户端 代码如下: /****************** server program *****************/ #include ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java_Socket简单通信
举报原因:
原因补充:

(最多只允许输入30个字)