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