首页 技术 正文
技术 2022年11月12日
0 收藏 802 点赞 4,558 浏览 7426 个字

Java网络编程,我们先来看下面这一张图:

由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听。通过accept来判断是否有客户端与其相连。若成功连上,则通过readline和println函数来进行数据的发送和接收。实现网络编程。

示例如下:

服务器端代码:

/*
* 功能:演示Java网络编程的服务器端
* author:ywq
*/
import java.io.*;
import java.net.*;
public class TestServer {InputStreamReader isr;
BufferedReader br;
PrintWriter pw;public static void main(String[] args) {
TestServer ts=new TestServer();}
public TestServer()
{ try {
//监听某个端口
ServerSocket ss=new ServerSocket(9999);
System.out.println("我是socket服务器正在监听9999端口.........");
//等待某个客户端来连接,accept()函数将返回一个socket连接
Socket s=ss.accept();//要读取s中传递的数据
isr =new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
//通过readline()函数来读写数据
String info=br.readLine();
System.out.println("服务器收到的消息为:"+info);//我们通过pw向s写数据,true表示即时刷新
pw=new PrintWriter(s.getOutputStream(),true);
pw.println("你也好,我是服务器!!!");
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(pw!=null)
pw.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

客户端代码:

/*
* 功能:这是一个客户端,可以连接服务器端
* author:ywq
*/
import java.io.*;
import java.net.*;
public class TestClient {InputStreamReader isr;
BufferedReader br;
PrintWriter pw;public static void main(String[] args) {
TestClient tc=new TestClient();
}public TestClient()
{
try {
//socket()函数就是去连接某个服务器,ip+端口
Socket s=new Socket("127.0.0.1",9999);//如果s连接成功,就可以发送数据到服务器端
//我们通过pw向s写数据,true表示即时刷新
pw=new PrintWriter(s.getOutputStream(),true);
pw.println("你好,我是客户端!!!");//读取s中传递的数据
isr =new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
/ /通过readline()函数来读写数据
String info=br.readLine();
System.out.println("客户端收到的消息为:"+info);} catch (IOException e) {e.printStackTrace();
}finally{
try {
if(pw!=null)
pw.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}}
}

发送数据时用到了PrintlnWriter对象,标准形式为:

PrintWriter pw=new PrintWriter(s.getOutputStream(),true)

其中true参数表示即时刷新。

通过InputStreamReader以及readline函数来实现数据的读取。

下边是一个半双工的示例:

服务器端代码:

/*
* 功能:演示从控制台进行对话
* author:ywq
*/
import java.net.*;
import java.io.*;
public class TestServer {InputStreamReader isr,isr2;
BufferedReader br,br2;
PrintWriter pw;
public static void main(String[] args) {
// TODO Auto-generated method stub
TestServer ts=new TestServer();
}public TestServer()
{
try {
ServerSocket ss=new ServerSocket(3002);
System.out.println("服务器在监听3002端口...");
//判断是否有客户端连接
Socket s=ss.accept();
//读取来自客户端的消息
isr=new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);pw=new PrintWriter(s.getOutputStream(),true);
//接收从控制台输入的信息
isr2=new InputStreamReader(System.in);
br2=new BufferedReader(isr2);while(true)
{String respone=br.readLine();
if(respone.equals("再见"))
{
System.out.println("对话结束");
s.close();
break;
}
System.out.println("客户端说:"+respone);System.out.println("请输入要发送到客户端的信息:");
String info=br2.readLine();
//将消息发送给客户端
pw.println(info);
if(info.equals("再见"))
{
System.out.println("对话结束");
s.close();
break;
}}} catch (IOException e) {e.printStackTrace();
}finally
{
if(br2!=null)
try {
br2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr2!=null)
try {
isr2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(pw!=null)
pw.close();
if(br!=null)
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr!=null)
try {
isr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}
}
}

客户端代码如下:

/*
* 功能:这是一个客户端,实现从控制台输入数据
* author:ywq
*/
import java.io.*;
import java.net.*;
public class TestClient {InputStreamReader isr,isr2;
BufferedReader br,br2;
PrintWriter pw;
public static void main(String[] args) {
// TODO Auto-generated method stub
TestClient tc=new TestClient();
}public TestClient()
{
try {
Socket s=new Socket("127.0.0.1",3002);
pw=new PrintWriter(s.getOutputStream(),true);
//从控制台接收消息
isr=new InputStreamReader(System.in);
br=new BufferedReader(isr); //从服务器接收信息
isr2=new InputStreamReader(s.getInputStream());
br2=new BufferedReader(isr2); while(true)
{
System.out.println("请说出你想对服务器说的话,按回车键结束");
//得到从控制台输入的消息
String resp=br.readLine();
//将数据发送给服务器
pw.println(resp);
if(resp.equals("再见"))
{
System.out.println("客户端使对话结束");
s.close();
break;
} String respo=br2.readLine();
if(respo.equals("再见"))
{
System.out.println("服务器使对话结束");
s.close();
break;
} System.out.println("服务器说:"+respo); }} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
if(br2!=null)
try {
br2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr2!=null)
try {
isr2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(pw!=null)
pw.close();
if(br!=null)
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr!=null)
try {
isr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}}}

自此,学到了基本的Java网络编程知识,有待进一步拓展。


进一步学习:

下面看一个简易对讲机的实现:

服务器端代码:

/*
* 功能:这是一个服务器,实现简易的对讲机,带界面
* author:ywq
*/
import javax.swing.*;import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;public class TestServer3 extends JFrame implements ActionListener{//定义组件
JTextArea jta=null;
JTextField jtf=null;
JButton jb=null;
JPanel jp=null;
JScrollPane jsp=null;InputStreamReader isr=null;
BufferedReader br=null;
PrintWriter pw=null;public static void main(String[] args) {
// TODO Auto-generated method stub
TestServer3 ts=new TestServer3();
}public TestServer3()
{
//创建组件
jta=new JTextArea();
jtf=new JTextField(10);
jb=new JButton("发送");
//设置监听
jb.addActionListener(this);jsp=new JScrollPane(jta);jp=new JPanel();
jp.add(jtf);
jp.add(jb);this.add(jp,"South");
this.add(jsp,"Center");this.setSize(300, 300);
this.setVisible(true);
this.setTitle("简易QQ聊天--服务器");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//建立socket连接
try {
ServerSocket ss=new ServerSocket(1234);
Socket s=ss.accept();isr=new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(),true);
//做一个循环
while(true)
{
//在循环中读取来自客户端的消息并且显示
String info=br.readLine();
jta.append("客户端说: "+info+"\r\n");}} catch (IOException e) {e.printStackTrace();
}}@Override
public void actionPerformed(ActionEvent e) {
//进行相应的操作
if(e.getSource()==jb)
{
//点击发送按钮后,将消息发送出去
String resp=jtf.getText();
jta.append("你对客户端说: "+resp+"\r\n");
pw.println(resp);
jtf.setText(" ");
}}
}

客户端如下:

/*
* 功能:这是一个客户端。可以实现简易对讲机
* author:ywq
*/import javax.swing.*;import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*; public class TestClient3 extends JFrame implements ActionListener{ //定义组件
JTextArea jta=null;
JTextField jtf=null;
JButton jb=null;
JPanel jp=null;
JScrollPane jsp=null;InputStreamReader isr=null;
BufferedReader br=null;
PrintWriter pw=null;public static void main(String[] args) {
// TODO Auto-generated method stub
TestClient3 tc=new TestClient3();
}public TestClient3()
{
//创建组件
jta=new JTextArea();
jtf=new JTextField(10);
jb=new JButton("发送");
//设置监听
jb.addActionListener(this);jsp=new JScrollPane(jta);jp=new JPanel();
jp.add(jtf);
jp.add(jb);this.add(jp,"South");
this.add(jsp,"Center");this.setSize(300, 300);
this.setVisible(true);
this.setTitle("简易QQ聊天--客户端");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//建立socket连接
try {
Socket s=new Socket("127.0.0.1",1234);isr=new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(),true);while(true)
{
//在循环中读取来自服务器的消息,并且显示
 String info=br.readLine();
jta.append("服务器说: "+info+"\r\n");}} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}@Override
public void actionPerformed(ActionEvent e) {
//点击发送按钮后,将消息发送出去
if(e.getSource()==jb)
{
String resp=jtf.getText();
jta.append("你对服务器说: "+resp+"\r\n");
pw.println(resp);
//清空
jtf.setText(" ");
}
}}

代码执行过程截图如下:

由截图可以看出:本实例较好的实现了聊天功能。但是距离真的模拟QQ聊天技术还差很多。有待进一步改进。

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