Socket实现简易聊天室,Client,Server
package seday08;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/**
* @author xingsir
*简易聊天室客户端
*/
public class Client {
/*
* 套接字 java.net.Socket
* Socket封装了底层TCP协议的通讯细节,使用它可以通过
* TCP协议与服务端建立链接,并以两条流进行IO操作完成 与服务端的数据交换
*/
private Socket socket;//声明了一个 Socket类型的对象
//构造方法
public Client() {
try {
System.out.println("正在连接服务器。。。。。。");
socket =new Socket("localhost",33069);//端口范围0-65535
System.out.println("已成功连接服务端!");
} catch (Exception e) {
e.printStackTrace();//输出错误堆栈信息,有助于定位并解决错误
}
}
/*
* 客户端开始工作的方法
*/
public void start() {
try {
OutputStream out = socket.getOutputStream();//客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。
OutputStreamWriter osw= new OutputStreamWriter(out);//字符转字节流
BufferedWriter bw=new BufferedWriter(osw);//缓冲流
PrintWriter pw =new PrintWriter(bw,true);//行更新
Scanner scanner=new Scanner(System.in);//控制台输入,获取键盘输入信息
while(true) {//条件为真
String message=scanner.nextLine();
pw.println(message);
}
} catch (Exception e) {
e.printStackTrace();//输出错误堆栈信息,有助于定位并解决错误
}
}
public static void main(String[] args) {
//实例化一个客户端
Client client = new Client();
//调用启动方法
client.start();
}
}
//===================================================================================
package seday08;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author xingsir
* 服务器端
*/
public class Server {
private ServerSocket server;//声明了一个ServerSocket类型的对象
//构造方法
public Server() {
try{
System.out.println("服务器正在启动。。。。。。");
server = new ServerSocket(33069);//接受的端口号
System.out.println("服务端启动完毕!");
}catch (IOException e) {
e.printStackTrace();//输出错误堆栈信息,有助于定位并解决错误
}
}
//服务端工作方法
public void start() {
try {
while(true) {
System.out.println("等待客户端连接。。。。。。");
Socket socket =server.accept();//accept():接受客户端的连接请求,并返回一个套接字
System.out.println("一个客户端链接了!");
/*
* Socket提供的方法:InputStream getInputStream()
* 通过Socket获取的输入流读取的字节是来自 远端计算机发送过来的字节。
*/
InputStream in = socket.getInputStream();
//将字节转换为字符
InputStreamReader isr= new InputStreamReader(in,"UTF-8");
BufferedReader br= new BufferedReader(isr);//块读,并且可以按行读取字符串
String message = null;//声明字符串message,初始化呢为空
/*
* 通过BufferedReader读取客户端发送过来的一行字符串这个操作中,当客户端断开连接时,
* 由于 客户端系统不同,服务端这里的表现也不相同:
* windows客户端断开时,readLine方法会直接抛出异常
* linux客户端断开连接时,readLine方法会返回 为null
*/
while((message = br.readLine())!=null) {
System.out.println("来自客户端的消息说:"+message);//控制台打印消息
}
}
} catch (Exception e) {
e.printStackTrace();//输出错误堆栈信息,有助于定位并解决错误
}
}
public static void main(String[] args) {
//实例化一个server端
Server server = new Server();
server.start();//调用方法
}
}
Socket实现简易聊天室,Client,Server的更多相关文章
- PHP 操作socket 实现简易聊天室
<?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP ); socket_bind($socket ,'127.0.0.1', ...
- 示例:Socket应用之简易聊天室
在实际应用中,Server总是在指定的端口上监听是否有Client请求,一旦监听到Client请求,Server就会启动一个线程来响应该请求,而Server本身在启动完线程之后马上又进入监听状态. 示 ...
- Express+Socket.IO 实现简易聊天室
代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- node+websocket创建简易聊天室
关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...
- Java实现简易聊天室
Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...
- socket 建立网络连接,client && server
client代码: package socket; import java.io.IOException; import java.net.Socket; /** * 客户端_聊天室 * * @aut ...
- node.js+websocket实现简易聊天室
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...
- 使用Android网络编程实现简易聊天室
在Java中我们可以利用socket编程实现聊天室,在Android中也一样,因为Android完全支持JDK本身的TCP.UDP网络通信API.我们可以使用ServerSocket.Socket来建 ...
随机推荐
- 双显卡安装Ubuntu 18.04和NVIDIA驱动
踩坑笔记: 用软碟通制作UBUNTU18.04 LTS启动盘 长按DEL键进入BIOS,关闭Security Boot,设置USB优先启动 在黑白的grub引导界面(第一行是Try Ubuntu- 第 ...
- ruby方法名之命名方式
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 modify_my_object!,这个方法名是以 ! 结尾,在 ruby 的对象里边是用于表达修改本身的意思. 比如 String#gsub ...
- 带着canvas去流浪系列之九 粒子动画【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 爬虫新宠requests_html 带你甄别2019虚假大学 #华为云·寻找黑马程序员#
python模块学习建议 学习python模块,给大家个我自己不专业的建议: 养成习惯,遇到一个模块,先去github上看看开发者们关于它的说明,而不是直接百度看别人写了什么东西.也许后者可以让你很快 ...
- FF.PyAdmin 接口服务/后台管理微框架 (Flask+LayUI)
源码(有兴趣的朋友请Star一下) github: https://github.com/fufuok/FF.PyAdmin gitee: https://gitee.com/fufuok/FF.Py ...
- where 和having 的区别
where : 约束声明,在查询结果返回之前对数据库中的查询条件进行约束 其后不能写聚合函数 having 过滤声明,在查询结果返回之后进行过滤,
- .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换
1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...
- zabbix分布式监控服务 安装与配置
zabbix安装与配置 一.什么是zabbix及优缺点(对比cacti和nagios) Zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存 ...
- 牛客剑指offer(持续更新~)
第一题:二维数组的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...
- 2018 牛客国庆集训派对Day4 - H 树链博弈
链接:https://ac.nowcoder.com/acm/contest/204/H来源:牛客网 题目描述 给定一棵 n 个点的树,其中 1 号结点是根,每个结点要么是黑色要么是白色 现在小 Bo ...