Java网络编程学习笔记

来源:互联网 发布:零售行业数据分析 编辑:程序博客网 时间:2024/05/16 19:17

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 stubTestServer  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 blocke.printStackTrace();}if(isr2!=null)try {isr2.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(pw!=null) pw.close();if(br!=null)try {br.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(isr!=null)try {isr.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 stubTestClient 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 blocke.printStackTrace();}finally{if(br2!=null)try {br2.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(isr2!=null)try {isr2.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(pw!=null) pw.close();if(br!=null)try {br.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(isr!=null)try {isr.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 stubTestServer3 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();}}@Overridepublic 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 stubTestClient3 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 blocke.printStackTrace();}}@Overridepublic void actionPerformed(ActionEvent e) {//点击发送按钮后,将消息发送出去if(e.getSource()==jb){String resp=jtf.getText();jta.append("你对服务器说:  "+resp+"\r\n");pw.println(resp);//清空jtf.setText("  ");}}}

代码执行过程截图如下:



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




4 0
原创粉丝点击