Java网络编程学习笔记

Java网络编程,我们先来看下面这一张图:

Java网络编程学习笔记_第1张图片



由图可得:想要进行网络编程,首先是服务器端通过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聊天技术还差很多。有待进一步改进。




你可能感兴趣的:(Java网络编程学习笔记)