首页 技术 正文
技术 2022年11月7日
0 收藏 423 点赞 839 浏览 3677 个字

网络编程的三要素:

  1. ip地址:唯一标识网络上的每一台计算机
  2. 端口号:计算机中应用的标号(代表一个应用程序),0-1024系统使用或者保留端口,有效端口0-65535(short)
  3. 通信协议:通信的规则 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();
}

使用上面的方式进行通信,实现结果: 
客户端:

java网络编程实现两端聊天

服务器: 
java网络编程实现两端聊天


这样实现了两端相互通信的要求,如果一方连续发送两条信息的时候,这个程序就会开始出现问题。于是使用线程解决这个问题,具体如下:

客户端:

 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();
}
}

运行结果: 
客户端 
java网络编程实现两端聊天 
服务器: 
java网络编程实现两端聊天

这样就可以实现基本上的通信了。如果有兴趣,可以结合JFrame窗体,实现多个窗口相互聊天,不再使界面这么难看。

  

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,999
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,511
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,357
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,140
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848