利用Java的Socket网络编程实现小型聊天室

Java网络编程——利用Socket实现简单的网上聊天功能 一、聊天功能的实现 在之前的文章里学习了Java中Socket编程的一些基本内容,现在简单写一个小程序,能够实现服务器端和客户端的聊天的功能。 服务器端: Server.java public class Server { public static void main(String[] args) throws IOException { ServerSocket s 阅读详情

前言

这个小型的聊天系统我没有用swt去做出界面出来,因为之前用的32位的,现在换了个环境导致之前的包不能用了,只能以控制台进行信息的交互。另外,这里介绍的是基于TCP的,UDP的简单一些就不介绍了。

基本代码

服务端

package thread.net;

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

public class Server {
	public static void main(String[] args) {
		// 指定服务器启动的时候占用的端口号,端口号取值是0~65535,1024一下预留给系统
		ServerSocket ssk = null;
		Socket sk = null;

		try {
			ssk = new ServerSocket(8888);
			System.out.println("服务器启动成功...");

			while (true) {
				sk = ssk.accept();
				new Thread(new MyServer(sk)).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

class MyServer implements Runnable {
	private Socket sk = null;
	private BufferedReader read = null;
	private PrintWriter pw = null;

	public MyServer(Socket sk) {
		this.sk = sk;
	}

	@Override
	public void run() {
		Scanner sc = new Scanner(System.in);

		try {
			read = new BufferedReader(new InputStreamReader(sk.getInputStream()));
			pw = new PrintWriter(sk.getOutputStream());

			String line = read.readLine();
			System.out.println("客户端问:" + line);

			while (!"bye".equalsIgnoreCase(line)) {
				System.out.println("请输入回答:");
				line = sc.nextLine();
				pw.println(line);
				pw.flush();
				line = read.readLine();
				System.out.println("客户端问:" + line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (pw != null) {
				pw.close();
			}

			if (read != null) {
				try {
					read.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (sk != null) {
				try {
					sk.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

		}

	}

}

客户端

package thread.net;

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

/**
 * Socket和ServerSocket 面向应用层编程
 * 
 * @author yuer
 *
 */
public class Cilent2 {
	public static void main(String[] args) {
		Socket sk = null;
		BufferedReader read = null;
		PrintWriter pw = null;
		@SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
		try {
			sk = new Socket("127.0.0.1", 8888);
			read = new BufferedReader(new InputStreamReader(sk.getInputStream()));
			pw = new PrintWriter(sk.getOutputStream());

			System.out.println("请输入您的问题:");
			String line = sc.nextLine();
			while (!"bye".equalsIgnoreCase(line)) {
				pw.println(line);
				pw.flush();
				line = read.readLine();
				System.out.println("服务器回答说:" + line);
				System.out.println("请输入您的问题:");
				line = sc.nextLine();
			}

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (pw != null) {
				pw.close();
			}

			if (read != null) {
				try {
					read.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (sk != null) {
				try {
					sk.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

		}

	}

}

说明:

服务端将每个客户端的请求封装为一个线程,这里也可以使用线程池对这些线程进行管理,这个就自己补充吧。还有就是改进点就是应该将读和写分开用线程包装,这样就不会出现写之前必须先读了。还有这里服务器可以改进为只当作一个中转站。

升级版的

服务端:

package com.yuer.io.net;

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

public class Server {
	public static void main(String[] args) {
		// 指定服务器启动的时候占用的端口号,端口号取值是0~65535,1024一下预留给系统
		ServerSocket ssk = null;
		Socket sk = null;

		try {
			ssk = new ServerSocket(8888);
			System.out.println("服务器启动成功...");

			while (true) {
				sk = ssk.accept();
				new Thread(new MySend(sk)).start();
				new Thread(new MyReceive(sk)).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}






客户端:

package com.yuer.io.net;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * Socket和ServerSocket 面向应用层编程
 * 
 * @author yuer
 *
 */
public class Cilent {
	public static void main(String[] args) {
		Socket sk = null;
		try {
			sk = new Socket("127.0.0.1", 8888);
			
			new Thread(new MySend(sk)).start();
			new Thread(new MyReceive(sk)).start();

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

	}

}

发送信息线程

package com.yuer.io.net;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * 发送信息的线程
 * @author Yuer
 *
 */
public class MySend implements Runnable {
	private Socket sk = null;
	private PrintWriter pw = null;
	
	public MySend(Socket sk) {
		this.sk = sk;
	}
	
	@SuppressWarnings("resource")
	@Override
	public void run() {
		Scanner sc = new Scanner(System.in);
		
		try {
			pw = new PrintWriter(sk.getOutputStream());
			
			String line  = "";
			
			while (true) {
				System.out.println("我说:");
				line = sc.nextLine();
				pw.println(line);
				pw.flush();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (pw != null) {
				pw.close();
			}
			
			if (sk != null) {
				try {
					sk.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
		}
		
	}
	
}

接受信息线程

package com.yuer.io.net;

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

 
/**
 * 接受信息的线程
 * @author Yuer
 *
 */
public class MyReceive implements Runnable {
	private Socket sk = null;
	private BufferedReader read = null;
	
	public MyReceive(Socket sk) {
		this.sk = sk;
	}
	
	@Override
	public void run() {
		
		try {
			read = new BufferedReader(new InputStreamReader(sk.getInputStream()));
			
			String line = read.readLine();
			System.out.println("他say:" + line);
			
			while (!"bye".equalsIgnoreCase(line)) {
				line = read.readLine();
				System.out.println("他say:" + line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			
			if (read != null) {
				try {
					read.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (sk != null) {
				try {
					sk.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
		}
		
	}
	
}

说明:

这个比之前的优化点在于将发送和接受两个逻辑分别封装为一个线程,解决了读写之间的阻塞。接下来的优化点在于服务端应该只充当一个中转方,使用@某人进行私聊。还有优化点在于心跳包机制保证socket长连接不掉线,每5秒发送一次心跳包,个人进行思考完成即可。哈哈哈

Java:小型聊天室系统 个人设计分析总结(一) 设计要求:在课本第15章Java网络通信例15.3、15.4的基础上,编写完成以下功能的小型Java聊天室系统。 多客户端模式下,实现客户与客户的单独通信,要求信息通过服务器中转。 端到端的通信,实现并行模式 实现端到端的文件传输。 多客户的单独通信 改进思路:多客户的情况下实现客户与客户之间的通信,关键在于服务器端与客户端连接时,获取到不同的与客户端一一对应的socket套接字需要在服务器... 阅读详情

相关推荐

java大作业网络聊天室

这个项目是我大一的java期末大作业,学习了一个学期的成果,编程能力不够,做的并不够好,写在这里记录一下自己的成长,也欢迎大家给出宝贵意见! 该篇博客写一个基于java的单/多人网络即时聊天室,聊天室 ...

your_flavor的博客 1万+

Java 使用Socket实现简易聊天室(新手控制台版)

一.服务器端思路整理 想要实现聊天室,对于服务器端由于需要一直监听用户的连接以及用户的消息发送,所以需要多线程来为每一个用户分配一个线程来实现功能。 实现start方法,创建serverSocket链接,死循环用以监听客户端用户的链接,当一个用户链接之后,就为其新开一个线程。通过这个新开的线程来实现对每个用户的功能。 public void start() throws IOException { ServerSocket server = new ServerSocket(88...

qq_45672288的博客 5725

用Java实现基于Socket的网络编程

使用Java语言,采用TCP协议,实现一对一、一对多的通信(无用户界面)

小姚的博客 8850

JAVA简单聊天室的实现

鉴于之前有不少同学在跟我要客户端的代码,我近期整理了一下,把整个工程都传到github上了。地址:https://github.co/Alexlingl/Chatroom 里面有比较详细的工程运行教程,这篇博客则主要对工程的代码实现进行介绍,没有通信知识基础的同学,在看这篇博客之前可以先看下我通信板块的另外几篇博客: 《JAVA通信(一)——输入数据到客户端》 《JAVA通信(二)——实现客...

Alexwym的博客 5万+

Java使用socket网络编程实现多人聊天室

前言:套接字(socket)编程能够实现服务器和客户端的通信,以下通过Socket编程实现多人聊天室。 程序展示: 界面类1.客户端界面 ClientView.javapublic class ClientView extends JFrame implements ActionListener, KeyListener, Runnable { private JTextArea t

QAQ 2万+

Android网络编程之Socket通信实现简单聊天室

socket通信是基于底层TCP协议实现的,是一种可靠的网络连接,通过三次握手成功建立网络连接之后进行通信。这种服务端不需要任何的配置文件和tomcat就可以完成服务端的发布,使用纯java代码实现通信。socket是对TCP/IP的封装调用,本身并不是一种协议,我们通过socket来调用协议来跟服务端进行通信和数据的传输。socket就像客户端与服务端之间的一条信息通道,每一个不同的客户端都会建立

u014393454的专栏 5860

用JavaSocket编程开发聊天室,附超详细注释

用JavaSocket编程开发聊天室 大二下册的JavaWeb课程设计,使用的是eclipse。 一、实现功能 登录:用Java图形用户界面编写聊天室服务器端和客户端,支持多个客户端连接到一个服务器。每个客户端能够输入账号。 群聊:可以实现群聊(聊天记录显示在所有客户端界面)。 好友列表:完成好友列表在各个客户端上显示。 私聊:可以实现私人聊天,用户可以选择某个其他用户,单独发送信息,接受私聊消息方可以直接弹出消息框。 踢人:服务器能够群发系统消息,能够强行让某些用户下线。 更新:客

weixin_44194299的博客 8630

Java——多人聊天室(基于TCP的网络编程——Socket)

Java——多人聊天室(基于TCP的网络编程——Socket) 服务端源代码: import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.PrintWri

qingsatianxia的博客 1万+

Java实现Socket聊天室

讲述了网络编程的一些基本知识,两个案例了解如何通过Socket编程。 案例一实现了Socket的基本使用,案例二实现了一个通过Socket的聊天室

weixin_64340669的博客 2915

【网络编程知识】使用Socket通信,做一个简单的多人聊天室

Socket 作为网络编程超级重要的一个知识点,对于程序员自然是一个必备的东西。 正好最近在看一些Socket套接字的内容,就想着能不能使用Socket做一个简单的通信功能,来加深对Socket的认知。 所以这篇文章就来使用Socket来简单制作一个多人聊天室,看看Socket到底怎样进行使用。

努力前行,总会成为自己心中的那道光 1万+

Java简单模拟QQ

使用java简单实现QQ 注册 登陆 聊天 远处协助 文件传送

Java网络编程小项目——聊天室

学习了网络编程后,我们都可以实现通过TCP协议进行服务端和客户端之间的简单通信但是这远远不过瘾啊!我想要一个那种带界面的,可以实现多人聊天的聊天室。我就是这样的,终于按耐不住诱惑花了两天时间根据TCP通信做了一个这样的聊天室小项目如果也有想我一样的盆友,实现时没了思路,可以参考一下我的哦(˵¯͒〰¯͒˵)

m0_74808313的博客 6233

JAVA模拟QQ聊天程序

用 JAVA写的 模拟QQ 聊天程序。。。。。。。。。。。在下载后,运行com.qq.server包地下的QQServer类,先把服务器启动起来,然后运行com.qq.clinet包地下的QQClinet类。运行客户端。中间需要输入绑定的端口自己设一个就可以如:7070.运行客户端的时候需要输入绑定IP就是你本机的ip地址,也可以输入127.0.0.1.端口输入启动服务器时候的端口就可以了。

Java网络编程入门指南:实现一个多人聊天室

Socket是Java网络编程的基本组成部分,它允许应用程序通过网络发送和接收数据。这个简单的聊天室示例允许多个客户端通过输入消息与服务器进行通信,服务器会将接收到的消息广播给所有连接的客户端。客户端和服务器之间的通信是基于Socket实现的。创建一个基本的Java服务器,以便接受来自客户端的连接请求和数据传输。创建一个基本的Java客户端,以便连接到服务器并进行数据传输。创建一个基本的RMI客户端,以便调用远程服务器上的方法。创建一个基本的RMI服务,以便远程调用服务器上的方法。

futurn_hero的博客 3080

Java实现聊天室系统(socket 套接字编程)

Java实现聊天室系统,socket编程,消息发送+文件传送,可实现指定用户发送信息,可实现指定用户发送文件

模拟QQ聊天程序

聊天程序可实现用户上线自动添加功能,客户端可以互发信息

java-网络编程socket-聊天室-先导

除了Java内置的异常类外,程序员还可以定义自己的异常类。这通常用于表示特定于应用程序的错误情况。自定义异常类应该继承自Exception或其子类。Java的异常机制提供了一种结构化的方式来处理程序中可能出现的错误情况。通过合理地使用异常处理机制,可以提高程序的健壮性和可维护性。主要记住 异常是分两种非检查异常(逻辑错误导致的异常通过运行判断) 可以不用写try-catch,通常根据业务自定义异常。

qq_61549190的博客 1284

基于java+socket编写的聊天室

基于java+socket编写的聊天室,启动时必须运行两次程序。其中,先开服务器,再开客户端。一方输入127.0.0.1,另一连接即可进行聊天。如果不会运行或者想买项目,联系qq:937062188

上一篇: 深度解读Tomcat中的NIO模型
下一篇: 怎么解决输入流和输出流编码问题?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值