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聊天技术还差很多。有待进一步改进。