java网络编程实现两端聊天
网络编程的三要素:
- ip地址:唯一标识网络上的每一台计算机
- 端口号:计算机中应用的标号(代表一个应用程序),0-1024系统使用或者保留端口,有效端口0-65535(short)
- 通信协议:通信的规则 TCP UDP
UDP:相当于发短信,不需要建立连接,数据包的大小限制在64k内,效率高,不安全,容易丢包
TCP:相当于打电话,需要建立连接,效率相对较低,数据传输安全,三次握手完成。
下面使用TCP进行网络通信:
服务端:
public static void main(String[] args) throws Exception {
//创建服务端的对象
ServerSocket ss = new ServerSocket(8000);
//等待客户端的接入
Socket client = ss.accept();
//从输入流中得到数据
InputStream is = client.getInputStream();
byte[] by = new byte[1024];
int len = is.read(by);
String str = new String(by,0,len);
System.out.println(str);
//关闭
client.shutdownInput();
is.close();
client.close();
}
客户端:
public static void main(String[] args) throws Exception {
//创建客户端套接字对象,给定ip地址
Socket client = new Socket("192.168.6.166",8000);
//获取客户端的输出流
OutputStream os = client.getOutputStream();
//向输出流中写入数据
os.write("在?".getBytes());
os.flush();
//切断输出流
client.shutdownOutput();
//关闭流对象,关闭套接字
is.close();
os.close();
client.close();
}
通过上面的代码能够实现基本的发送信息,和接收信息。不过只能客户端发送信息,服务器被动接收信息,下面来实现客户端和服务器互相发送信息:
服务器端:
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8000);
Scanner sc = new Scanner(System.in);
System.out.println("服务器启动!");
Socket s = ss.accept();
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
boolean bool = true;
while(bool){
//服务器接收信息
byte[] bt = new byte[1024];
int length = is.read(bt);
System.out.println("\t\t\t"+new String(bt,0,length)+":客户端");
//服务器发送信息
System.out.println("服务器:");
os.write(sc.next().getBytes());
os.flush();
}
s.shutdownInput();
is.close();
os.close();
s.close();
ss.close();
}
客户端:
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("客户端启动");
Socket client = new Socket("127.0.0.1",8000);
Scanner sc = new Scanner(System.in);
boolean bool = true;
OutputStream os = client.getOutputStream();
InputStream is = client.getInputStream();
while(bool){
//客户端发送信息
System.out.println("客户端:");
String str = sc.next();
os.write(str.getBytes());
os.flush();
//客户端接收信息
byte[] by = new byte[1024];
int index = is.read(by);
System.out.println("\t\t\t"+new String(by,0,index)+":服务器");
}
client.shutdownOutput();
os.close();
is.close();
sc.close();
client.close();
}
使用上面的方式进行通信,实现结果:
客户端:
服务器:
这样实现了两端相互通信的要求,如果一方连续发送两条信息的时候,这个程序就会开始出现问题。于是使用线程解决这个问题,具体如下:
客户端:
public class servletSockettest {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8888);
System.out.println("服务器启动!");
final Socket s = ss.accept();
boolean b = true;
InputStream is = s.getInputStream();
//服务器把输入放入线程里面执行,不会影响主线程的接收信息功能
Thread t = new Thread(){
OutputStream os = s.getOutputStream();
Scanner sc = new Scanner(System.in);
@Override
public void run() {
// TODO Auto-generated method stub
boolean b = true;
while(b){
try {
System.out.print("服务器输入:");
os.write(sc.next().getBytes());
os.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
t.start();
while(b){
byte[] bt = new byte[1024];
int length = is.read(bt);
String str = new String(bt,0,length);
System.out.println("\t\t\t"+str+":客户端");
}
is.close();
s.shutdownInput();
s.close();
ss.close();
}
}
客户端:
public class Sockettest {
public static void main(String[] args) throws UnknownHostException, IOException {
final Socket client = new Socket("192.168.6.166",8888);
Scanner sc = new Scanner(System.in);
System.out.println("客户端启动");
OutputStream os = client.getOutputStream();
//新建一个线程用来接收信息,不影响主线程的输入发送信息。
Thread t = new Thread(){
InputStream is = client.getInputStream();
@Override
public void run() {
// TODO Auto-generated method stub
boolean b = true;
while(b){
try {
byte[] bt = new byte[1024];
int length = is.read(bt);
String str = new String(bt,0,length);
System.out.println("\t\t\t"+str+":服务器");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
t.start();
boolean b = true;
while(b){
System.out.print("客户端输入:");
os.write(sc.next().getBytes());
os.flush();
}
os.close();
client.shutdownOutput();
client.close();
}
}
运行结果:
客户端
服务器:
这样就可以实现基本上的通信了。如果有兴趣,可以结合JFrame窗体,实现多个窗口相互聊天,不再使界面这么难看。
java网络编程实现两端聊天的更多相关文章
- Java网络编程(UDP协议-聊天程序)
接收端: package WebProgramingDemo; import java.net.DatagramPacket; import java.net.DatagramSocket; publ ...
- Java 网络编程---分布式文件协同编辑器设计与实现
目录: 第一部分:Java网络编程知识 (一)简单的Http请求 一般浏览网页时,使用的时Ip地址,而IP(Internet Protocol,互联网协议)目前主要是IPv4和IPv6. IP地址是一 ...
- Java网络编程(一)
Java网络编程: 1.1: 网络编程:对于我这个“研究不深”的网络菜鸟来说,我觉得网络编程就是实现计算机与计算机之间通信的编程.写些能够实现计算机与计算机之间的通信就行了(目前来说). 1.2:一台 ...
- JAVA 网络编程 - 实现 群聊 程序
在实现 这个 程序之前, 我们 需要 了解 一些 关于 Java 网络 编程 的 知识. 基本 的 网络知识: 网络模型 OSI (Open System Interconnection 开放系统互连 ...
- java网络编程socket解析
转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...
- [未完成]关于Java网络编程总结
网络的七层结构: 第一层:物理层,网线. 第二层: 数据链路层,交换机.交换机有IP地址.这一层的数据叫做帧 第三层:网络层,数据包方向的定义,路由器.现在也有具有路由功能的交换机.主要将从下层接收到 ...
- 网络编程TCP协议-聊天室
网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...
- Java网络编程技术2
3. UDP数据报通信 UDP通信中,需要建立一个DatagramSocket,与Socket不同,它不存在“连接”的概念,取而代之的是一个数据报包——DatagramPacket.这个数据报包必须知 ...
- Java网络编程技术1
1. Java网络编程常用API 1.1 InetAddress类使用示例 1.1.1根据域名查找IP地址 获取用户通过命令行方式指定的域名,然后通过InetAddress对象来获取该域名对应的IP地 ...
随机推荐
- 利用wamp配置虚拟主机
第一步:打开wamp--Apache--httpd.conf找到# Virtual hosts 一行,把其下面的一行中的#去掉.
- VMware Mac OS中无法找到适应的分辨率的解决办法
使用VMware安装的Mac OS中,有时在显示器的分辨率中的选择项里面,没有对应显示的分辨率可供选择的时候(无法自适应),可以在虚拟机设置里,显示器中修改强制分辨率.修改过后重启虚拟机,就可以有对应 ...
- C#调用TSC条码打印机打印条码
#region 调用TSC打印机打印条码 /// <summary> /// 调用TSC打印机打印条码 /// </summary> /// <param name=&q ...
- Scratch2的离线下载与安装
scratch是一种程序设计语言,可以用来设计 故事.动画.游戏.音乐和美术作品. Scratch主页:https://scratch.mit.edu/ Scratch的下载与安装: 首先下载并安装A ...
- vijos1047题解
总算编好了这一题,我表示200+行,亚历山大. 题目描述很简单,做起来不简单啊.(高精度的取模和除法不是一般的恶心!) 先说一下非高精度的一般做法. 求两个数a,b的最小公倍数,就是a.b的乘积与a. ...
- 在Jekyll博客添加评论系统:gitment篇
最近在Github Pages上使用Jekyll搭建了个人博客( jacobpan3g.github.io/cn ), 当需要添加评论系统时,找了一下国内的几个第三方评论系统,如"多说&qu ...
- .net ElasticSearch-Sql 扩展类
官方提供的是java sdk,并支持jdbc方式的查询结果输出;但是却没有.net sdk的支持. 开发 ElasticSearch-Sql 第三方开源项目的.net sdk,未来集成入bsf框架.( ...
- linux shell变量$#,$@,$0,$1,$2的含义解释
变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 ...
- If I were you
别让孩子输在起跑线上,这句话有道理吗? 答:和别人比较是人生悲剧的源头. 做哪些事情可以提高生活的品质? 答:定期扔东西. 结婚以后,两个人在一起最重要的是什么? 答:就当这婚还没结呢. 去做你害怕的 ...
- Java调度实现
根据自己在项目中用到的调度,简单说说:(如有不正确的地方,请留言...) Java调度:他是用来解决访问时间慢的手段. 通俗的讲就是为需要的数据(你需要展示的数据)建立一张中间表存放,提前把数据读出来 ...