Java-Java基础09之Java网络编程的应用

主要内容有:Java网络编程的应用,创建一个基于socket连接的客户端程序,可以连接服务器端,并接收与发送信息,分别实现半双工通信与全双工通信。

文件结构

文件结构
文件结构

Java网络编程_netTest1Client/com.test1/MyClient1.java

/**
 * 这是一个客户端程序,可以连接服务器端
 */
package com.test1;
import java.io.*;
import java.net.*;
public class MyClient1 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyClient1 mc1=new MyClient1();
    }
    public MyClient1()
    {
        try {
            //Socket()就是去连接某个服务器端,127.0.0.1表示服务器的IP
            //9999就是端口号
            Socket s=new Socket("127.0.0.1",9999);
            //如果s连接成功,就可以发送数据给服务器
            //通过pw,向s写数据,true表示即时刷新
            PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
            pw.println("你好吗?我是客户端");
            //客户端接收
            InputStreamReader isr=new InputStreamReader(s.getInputStream());
            BufferedReader br=new BufferedReader(isr);
            String response=br.readLine();
            System.out.println("我是客户端!\n我收到了服务器回复的信息:"+response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Java网络编程_netTest1Client/com.test1/MyServer1.java

/**
 * 这是第一个服务器端程序,让它在9999端口监听
 * 可以接收从客户端发来的信息
 */
package com.test1;
import java.io.*;
import java.net.*;
public class MyServer1 {
    public static void main(String []args)
    {
        MyServer1 ms1=new MyServer1();
    }
    public MyServer1()
    {
        try {
            //在9999号端口监听
            ServerSocket ss=new ServerSocket(9999);
            System.out.println("我是服务器,在9999端口监听...");
            //等待某个客户端来连接,该函数会返回一个Scoket连接
            Socket s=ss.accept();
            System.out.println("有客户端连接");
            //要读取取s中传递的数据
            InputStreamReader isr=new InputStreamReader(s.getInputStream());
            BufferedReader br=new BufferedReader(isr);
            String info=br.readLine(); //读
            System.out.println("服务器接收到:"+info);
            //服务器回复一句话
            PrintWriter pw=new PrintWriter(s.getOutputStream(),true);//true表示即时刷新
            pw.println("我是服务器,客户端你也好!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Java网络编程_netTest2Client/com.test1/MyClient2.java

/**
 * 半双工通信
 * 功能:客户端
 */
package com.test1;
import java.net.*;
import java.io.*;
public class MyClient2 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyClient2 mc2=new MyClient2();
    }
    public MyClient2()
    {
        try {
            //连接服务器端
            Socket s=new Socket("127.0.0.1",9999);
            //向s写入数据
            PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
            //先接收从控制台输入的信息
            InputStreamReader isr=new InputStreamReader(System.in);
            BufferedReader br=new BufferedReader(isr);
            //接收从服务器端发送过来的信息
            InputStreamReader isr2=new InputStreamReader(s.getInputStream());
            BufferedReader br2=new BufferedReader(isr2);
            while(true)
            {
                System.out.println("请输入你想对服务器说的话:");
                //客户端先从控制台接收
                String info=br.readLine();
                //然后把从控制台输入的信息发送给服务器
                pw.println(info);
                if(info.equals("bye"))
                {
                    System.out.println("对话结束");
                    s.close();
                    break;
                }
                //接收从服务器发来的话
                String res=br2.readLine();
                System.out.println("服务器说:"+res);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Java网络编程_netTest2Client/com.test1/ MyServer2.java

/**
 * 半双工通信
 * 功能:一个服务器端,在9999端口上监听
 */
package com.test1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
import java.io.*;
public class MyServer2 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyServer2 ms2=new MyServer2();
    }
    public MyServer2()
    {
        try {
            //在9999端口监听
            ServerSocket ss=new ServerSocket(9999);
            System.out.println("服务器在9999监听...");
            //等待连接
            Socket s=ss.accept();
            //向s中写信息
            PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
            //先接收客户端发来的信息(Socket上的)
            InputStreamReader isr=new InputStreamReader(s.getInputStream());
            BufferedReader br=new BufferedReader(isr);
            //接收从控制台输入的信息
            InputStreamReader isr2=new InputStreamReader(System.in);
            BufferedReader br2=new BufferedReader(isr2);
            while(true)
            {
                String infoFromClient=br.readLine();
                System.out.println("客户端发来:"+infoFromClient);
                if(infoFromClient.equals("bye"))
                {
                    System.out.println("对话结束!");
                    s.close();
                    break;
                }
                //接收从控制台输入的信息
                System.out.println("输入你希望对客户端说的话:");
                String response=br2.readLine();
                //把从控制台接受的信息送给客户端
                pw.println(response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Java网络编程_netTest3Client/com.test1/MyClient3.java

/**
 * 全双工通信
 * 客户
 */
package com.test1;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
public class MyClient3 extends JFrame implements ActionListener{
    JTextArea jta=null;
    JTextField jtf=null;
    JButton jb=null;
    JScrollPane jsp=null;
    JPanel jp1=null;
    //把信息发给客户端的对象
    PrintWriter pw=null;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyClient3 ms=new MyClient3();
    }
    public MyClient3()
    {
        jta=new JTextArea();
        jsp=new JScrollPane(jta);
        jtf=new JTextField(10);
        jb=new JButton("发送");
        jb.addActionListener(this);
        jp1=new JPanel();
        jp1.add(jtf);
        jp1.add(jb);
        this.add(jsp,"Center");
        this.add(jp1,"South");
        this.setSize(300,200);
        this.setTitle("QQ简易聊天-客户端");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        try {
            Socket s=new Socket("127.0.0.1",9988);
            InputStreamReader isr=new InputStreamReader(s.getInputStream());
            BufferedReader br=new BufferedReader(isr);
            pw=new PrintWriter(s.getOutputStream(),true);
            while(true)
            {
                //不停的读取从服务器发来的信息
                String info=br.readLine();
                jta.append("服务器端对客户端说: "+info+"\r\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //如果用户按下发送信息的按钮
        if(e.getSource()==jb)
        {
            //把服务器在jtf写的内容发送给客户端
            String info=jtf.getText();
            //把客户端显示的信息加到jta
            jta.append("客户端对服务器说: "+info+"\r\n");
            pw.println(info);
            //清空jtf中的内容
            jtf.setText("");
        }
    }
}

Java网络编程_netTest3Client/com.test1/ MyServer3.java

/**
 * 全双工通信
 * 服务器端
 */
package com.test1;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
public class MyServer3 extends JFrame implements ActionListener{
    JTextArea jta=null;
    JTextField jtf=null;
    JButton jb=null;
    JScrollPane jsp=null;
    JPanel jp1=null;
    //把信息发给客户端的对象
    PrintWriter pw=null;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyServer3 ms=new MyServer3();
    }
    public MyServer3()
    {
        jta=new JTextArea();
        jsp=new JScrollPane(jta);
        jtf=new JTextField(10);
        jb=new JButton("发送");
        jb.addActionListener(this);
        jp1=new JPanel();
        jp1.add(jtf);
        jp1.add(jb);
        this.add(jsp,"Center");
        this.add(jp1,"South");
        this.setSize(300,200);
        this.setTitle("QQ简易聊天-服务器端");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        try {
            //服务器监听
            ServerSocket ss=new ServerSocket(9988);
            //等待客户端连接
            Socket s=ss.accept();
            //System.out.println("服务器端在9988监听!");
            InputStreamReader isr=new InputStreamReader(s.getInputStream());
            BufferedReader 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)
        {
            //把服务器在jtf写的内容发送给客户端
            String info=jtf.getText();
            jta.append("服务器端对客户端说: "+info+"\r\n");
            pw.println(info);
            //清空jtf中的内容
            jtf.setText("");
        }
    }
}

Java网络编程_netTestClient/com.test1/MyServer.java

/**
 * 功能:网络这间利用 对象流
 */
package com.test1;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.common.*;
public class MyServer {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyServer ms=new MyServer();
    }
    public MyServer()
    {
        try {
            ServerSocket ss=new ServerSocket(3456);
            System.out.println("服务器在3456端口监听...");
            Socket s=ss.accept();
            //以对象流方式读取(假设客户端发送的是User的一个对象)
            ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
            User u=(User)ois.readObject();//读取对象
            //输出
            System.out.println("从客户端接收到:"+u.getName()+" "+u.getPass());
            s.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Java网络编程_netTestClient/com.common/User.java

package com.common;
public class User implements java.io.Serializable{
    //将这个类实现序列化
    private String name;
    private String pass;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
}

Java网络编程_netTestClient/com.test1/MyClient.java

package com.test1;
import java.io.*;
import java.net.*;
import com.common.User;
import com.test1.*;
public class MyClient {
    /**
     * @param args
     */
    public static void main(String[] args) {
        //
        MyClient mc=new MyClient();
    }
    public MyClient()
    {
        try {
            Socket s=new Socket("127.0.0.1",3456);
            //通过ObjectOutputStream给服务器传送对象
            ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
            User u=new User();
            u.setName("维唯为为");
            u.setPass("123456");
            oos.writeObject(u); //写入对象流
            //如果希望一个对象在网络上传输,则需要把这个对象序列化
            //System.out.println("ok");
            s.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Java网络编程_netTestClient/com.common/User.java

package com.common;
public class User implements java.io.Serializable{
    //将这个类实现序列化
    private String name;
    private String pass;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
}

版权所有,转载请注明出处 luowei.github.io.