`
miaoge
  • 浏览: 109318 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类

【Socket网络通信】利用TCP/IP协议实现服务端与客户端的双向聊天

阅读更多

服务器:

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 *  @author $KangMiao$
 *  服务端
 * 与TCPTalkClient02.java一起用
 * 利用TCP/IP协议实现服务端与客户端的双向聊天
 * 问题:①当服务端输入quit时 ,我输入的信息客户端接收不到,但可以看到客户端发来的信息。
 * (已解决) 在两个线程中分别关闭相应的流
 */

public class TCPTalkServer02 {
	public void talk() {
		try {
			ServerSocket ss = new ServerSocket(8888);  
			System.out.println("聊天服务器开启···");
			Socket s = null;
			while ((s = ss.accept()) != null) {
				System.out.println(s.getInetAddress()+"朋友来访中-----");
				ThreadTalk tt = new ThreadTalk(s);
				tt.start();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		TCPTalkServer02 talk = new TCPTalkServer02();
		talk.talk();
	}
}

class ThreadTalk extends Thread {
	private Socket s;
	private BufferedReader br;
	private BufferedReader brConsole;
	private PrintStream ps;
	private InetAddress ip;

	public ThreadTalk(Socket s) {
		this.s = s;
	}

	public void run() {
		try {
			br = new BufferedReader(new InputStreamReader(s
					.getInputStream()));// 从客户端读取数据
			brConsole = new BufferedReader(
					new InputStreamReader(System.in)); // 从服务端读取数据
			ps = new PrintStream(s.getOutputStream()); // 向客户端输入数据
			//获得客户端ip地址
			ip = s.getInetAddress();
			ps.println("服务端传话:欢迎访问聊天服务器!");
			TalkThread tat = new TalkThread(brConsole, ps);
			tat.start(); // 这里用到多线程 实现双方互相对话
			String temp = "";
			while ((temp = br.readLine()) != null) {
				if (temp.equalsIgnoreCase("quit")) {
					System.out.println("与第" + ip+ "断开连接!");
					ps.println("断开连接,欢迎下次访问!");
					break;
				}
				System.out.println( ip+"说:" + temp);
			}
		} catch (IOException e) {
			if("Connection reset".equals(e.getMessage())){
				System.out.println("客户端异常退出!");
			}
		}finally {
			try {
				br.close();
				System.out.println(ip+"已断开链接!");
				s.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

class TalkThread extends Thread {
	private BufferedReader brConsole;
	private PrintStream ps;

	public TalkThread( BufferedReader brConsole,PrintStream ps) {
		super();
		this.brConsole = brConsole;
		this.ps = ps;
	}

	public void run() {
		String temp = "";
		try {
			while ((temp = brConsole.readLine())!= null) {
				ps.println(temp);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				brConsole.close();
				ps.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 

 

 

客户端:

/**
 * @author $KangMiao$
 * 客户端
 * 与TCPTalkServer02.java一起用
 * 建立TCP双向通信客户端
 * 问题:①当客服端输入quit时 断开连接 但弹出异常,如下:
 * (已解决) 
 * java.net.SocketException: socket closed
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(Unknown Source)
	at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(Unknown Source)
	at sun.nio.cs.StreamDecoder$CharsetSD.implRead(Unknown Source)
	at sun.nio.cs.StreamDecoder.read(Unknown Source)
	at java.io.InputStreamReader.read(Unknown Source)
	at java.io.BufferedReader.fill(Unknown Source)
	at java.io.BufferedReader.readLine(Unknown Source)
	at java.io.BufferedReader.readLine(Unknown Source)
	at com.wepull.task.zuoye11.TalkThred3.run(TcpClient.java:76)
 */

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

public class TCPTalkClient02 {
	private Socket s;
	private BufferedReader consBr; //控制台输入流
	private PrintStream ps;    //网络输出流
	private BufferedReader br;
	 
	public void conn(){
		 try {
			s = new Socket("localhost",8888);
			br = new BufferedReader(new InputStreamReader(s.getInputStream()));
			ps = new PrintStream(s.getOutputStream()); //写给服务端
			consBr = new BufferedReader(new InputStreamReader
					(System.in));       //从控制台读取数据
			TalkThred4 tt = new TalkThred4(consBr,ps);
			tt.start();
			String temp1 = "";
			while ((temp1 = br.readLine())!= null) {
				if (temp1.equalsIgnoreCase("quit")) {
					System.out.println("服务端与你断开连接!");
					break;
				}
				System.out.println("服务端传话:" +temp1);
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				br.close();
				ps.close();
				s.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		TCPTalkClient02 tc = new TCPTalkClient02();
		System.out.println("客户端连接中·········");
		tc.conn();
	}
}

class TalkThred4 extends Thread {
	private BufferedReader consBr;
	private PrintStream ps;

	public TalkThred4( BufferedReader consBr,PrintStream ps) {
		super();
		this.consBr = consBr;
		this.ps = ps;
	}

	public void run() {
		String temp = null;
		try {
			while((temp = consBr.readLine())!=null){
				ps.println(temp);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				consBr.close();
				ps.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 

分享到:
评论

相关推荐

    Socket服务端客户端以tcp/ip协议发送接收报文

    在IT领域,网络通信是不可或缺的一部分,而Java Socket编程则是实现网络通信的一种常见方式,尤其在TCP/IP协议栈上。本教程将详细讲解如何利用Java Socket实现基于TCP/IP的服务端和客户端之间的报文发送与接收。 ...

    使用c#vs2008写的tcp/ip客户端与服务端聊天工具,很有示范的意义啦

    在IT领域,网络编程是构建分布式系统的基础,TCP/IP协议栈是互联网通信的核心。本示例涉及的是使用C#编程语言在Visual Studio 2008(VS2008)环境下开发的一个TCP/IP客户端与服务端的聊天工具。这个项目具有很高的...

    基于C#的TCP/IP协议客户端和服务器的代码实现

    本文将深入探讨如何使用C#语言实现TCP/IP协议的客户端和服务器,通过理解并实践相关代码,可以提升C#开发者在网络编程上的技能。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它...

    ROS环境下TCP/IP客户端和服务器端C++程序

    在ROS(机器人操作系统)环境中,TCP/IP通信是实现机器人组件间或者机器人与远程计算机之间通信的一种常见方式。本文将深入探讨如何使用C++在ROS环境下编写TCP/IP客户端和服务器端程序,确保其“绝对可用”。 首先,...

    TCP/IP客户端服务端通讯的例子代码

    实现TCP/IP客户端服务端通讯,开发者需要了解基本的网络编程概念,如socket编程接口、TCP/IP协议的工作原理以及数据在网络中的传输过程。在实际编程中,还要注意异常处理,确保程序的健壮性。 7. **应用场景**: ...

    基于局域网聊天程序设计其中网络通信部分采用流行的TCP/IP协议。程序采用典型的C/S(服务器/客户端)构架。用socket编程设计网络通讯

    其中网络通信部分采用流行的TCP/IP协议。程序采用典型的C/S(服务器/客户端)构架。用socket编程设计网络通讯。界面设计部分采用Windows MFC框架。数据库采用微软SQL Server。本文最终设计了一个简易版本的聊天软件,...

    灵活方便的TCP/IP Socket服务端及客户端工具

    标题中的“灵活方便的TCP/IP Socket服务端及客户端工具”是指一种基于TCP/IP协议的网络通信工具,它包含了服务端和客户端的实现。在计算机网络中,TCP/IP Socket是应用程序进行网络通信的一种标准接口,提供了数据...

    Tcp.zip_C# tcp/ip通讯_服务端

    总结起来,"Tcp.zip_C# tcp/ip通讯_服务端"是一个C#实现的TCP/IP通信示例,包含客户端和服务端程序,可以作为学习TCP/IP通信基础和C#网络编程的参考资料。理解并掌握这些基础知识,对于开发网络应用程序和构建可靠的...

    C#编写的TCP/IP通信程序,服务器和客户端

    本项目“C#编写的TCP/IP通信程序”就是基于C#的Socket编程实现的服务器和客户端示例,旨在帮助初学者理解和掌握TCP/IP通信的基本原理和编程技巧。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输...

    C# TCP/IP通信小例子

    C#是一种广泛用于构建桌面和Web应用程序的编程语言,它提供了强大的网络编程能力,其中包括TCP/IP协议的支持。本示例"**C# TCP/IP通信小例子**"是一个基础教程,旨在帮助新手理解如何在C#中实现TCP/IP通信。 TCP...

    基于socket应用的TCP/Ip通讯

    Socket是操作系统提供的编程接口(API),允许应用程序利用TCP/IP协议进行网络通信。Socket可以看作是两个网络应用程序之间的通信端点,一个在服务器端,一个在客户端。 在实现基于Socket应用的TCP/IP通讯时,我们...

    基于TCP/IP的Socket多线程通信(服务器和客户端)

    在计算机网络编程中,TCP/IP协议族是连接网络应用的核心,而Socket是其接口,它提供了应用程序与网络通信的能力。本主题将深入探讨基于TCP/IP的Socket如何实现多线程通信,包括服务器端和客户端的设计与实现。 1. *...

    默蓝网络通信测试工具(NIOSocket工具)支持TCP/IP和HTTP通信-网络通信开发人员必备

    《网络通信测试与Java NIO Socket编程详解》 在信息技术高速发展的今天,网络通信成为了软件开发中的重要一环。为了确保网络应用的稳定性和效率,网络通信测试工具扮演了不可或缺的角色。"默蓝网络通信测试工具(NIO...

    C#TCP-IP服务器和客户端源代码.rar

    C#语言提供了一种强大的方式来实现基于TCP/IP的网络通信,通过.NET Framework中的Socket类。本资源"**C# TCP-IP服务器和客户端源代码.rar**"就是针对C#新手设计的一套完整示例,帮助开发者理解和实现简单的TCP/IP...

    基于TCP/IP协议的最简单的例子

    总结起来,"基于TCP/IP协议的最简单的例子"这个主题涵盖的知识点广泛,包括TCP/IP协议的基本原理、Socket编程、服务端与客户端的交互以及异常处理等。通过实践这样的例子,开发者能够深入理解网络通信的基础,并能将...

    java tcp/ip 通讯服务端和客户端

    Java TCP/IP通信是网络编程中的基础部分,它涉及到如何通过Internet协议进行数据交换。TCP(传输控制协议)和IP(互联网协议)共同构成了互联网的基础,TCP确保数据的可靠传输,而IP负责数据在网络中的路由。在Java...

    TCP/IP创建客户端和服务端源码

    以下将详细解析TCP/IP协议以及如何利用这些源代码进行客户端和服务端的实现。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保了数据的正确顺序传输和错误检测...

    tcp.tar.gz_tcp/ip协议实现的通信

    让我们深入探讨一下TCP/IP协议以及如何在客户端和服务器之间实现通信。 TCP(传输控制协议)是四层模型中的传输层协议,负责提供可靠的数据传输服务。它通过序列号、确认应答、重传机制等确保数据包的正确顺序和无...

    socket 实现客户端和服务端的双向通信

    本实例主要关注如何使用Socket库来实现TCP/IP协议下的客户端(Client)与服务端(Server)之间的双向通信。TCP/IP协议是互联网上最常用的一种通信协议,它保证了数据的可靠传输。 首先,我们要理解Socket的工作原理...

Global site tag (gtag.js) - Google Analytics