zoukankan      html  css  js  c++  java
  • Java网络编程学习笔记

    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+"
    ");
    				
    				
    			}
    			
    			
    		} catch (IOException e) {
    			
    			e.printStackTrace();
    		}
    		
    		
    		
    		
    		
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		//进行相应的操作
    		if(e.getSource()==jb)
    		{
    			//点击发送按钮后,将消息发送出去
    			String resp=jtf.getText();
    			jta.append("你对客户端说:  "+resp+"
    ");			
    			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+"
    ");
    	
    					}
    					
    				} 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+"
    ");			
    			pw.println(resp);
    			//清空
    			jtf.setText("  ");
    		}
    	}
    
    }
    

    代码执行过程截图如下:



    由截图可以看出:本实例较好的实现了聊天功能。但是距离真的模拟QQ聊天技术还差很多。有待进一步改进。




  • 相关阅读:
    50个查询系列-第13个查询:把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
    50个查询系列-第12个查询:查询至少学过学号为“1001”同学所有课程的其他同学学号和姓名
    033医疗项目-模块三:药品供应商目录模块——供货商药品目录t添加查询功能----------Dao层和Service层和Action层和调试
    032医疗项目-模块三:药品供应商目录模块——供货商药品目录查询功能----------Service层和Action层和调试
    031医疗项目-模块三:药品供应商目录模块——供货商药品目录查询功能----------sql补充知识
    50个查询系列-第11个查询:查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
    030医疗项目-模块三:药品供应商目录模块——供货商药品目录查询功能----------Dao层:基本的查询语句的编写
    Java 代码性能调优“三十六”策
    JVM运行原理及Stack和Heap的实现过程
    细数那些不懂Spring底层原理带来的伤与痛
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467346.html
Copyright © 2011-2022 走看看