您的位置:首页 > 理论基础 > 计算机网络

Java网络编程学习笔记

2016-02-22 16:03 453 查看
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聊天技术还差很多。有待进一步改进。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: