java网络编程

本文介绍了一个简单的Java半双工聊天程序的实现方法,包括客户端和服务端的代码示例。该程序允许双方进行基本的消息交换,并展示了如何使用Socket进行网络通信。

一、Java网络编程原理

二、代码实现(半双工)

客户端程序

/**
 * 这是一个客户端程序,可以连接服务器端
 */
package com.test;
import java.net.*;
import java.io.*;
public class MyClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyClient mcl=new MyClient();
	}
	public MyClient()
	{
		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("客户端已经收到,"+response);
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
	}

}

服务器端程序:

/**
 * 这是第一个服务器端程序,让它9999端口监听
 * 可以接收从客户端发来的信息
 */
package com.test1;
import java.net.*;
import java.io.*;
public class MyServer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyServer msl=new MyServer();
	}
	public MyServer()
	{
		try {
			//在9999号端口监听
			ServerSocket ss=new ServerSocket(9999);
			System.out.println("我是服务器,我正在监听");
			//等待摸个客户来连接,该函数会返回一个Scokey连接
			Socket s=ss.accept();
			
			//要读取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);
			
			pw.println("你好吗,我是服务器");
			
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
	}

}

三、改进代码((有聊天界面)使客户端和服务器端能够多次通讯(半双工))

客户端程序:

/**
 * 客户端
 * 
 */
package com.test2;
import javax.swing.*;
import java.awt.event.*;
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.setTitle("qq简易聊天,客户端");
		this.setSize(300,200);
		this.setVisible(true);
		
		try {
			Socket s=new Socket("127.0.0.1", 9999);
			
			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) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
	if(arg0.getSource()==jb)
			
		{
			//把服务器jtf写的内容发送给客户端
			String info=jtf.getText();
			//把客户发送的信息显示到jta
			jta.append("客户端对服务器端说"+info+"\r\n");
			
			pw.println(info);
			
			//清空发送框的内容
			jtf.setText("");
		}
	}

}

服务器端:

/**
 * 服务器端
 * 
 */
package com.test1;
import javax.swing.*;

import java.io.*;
import java.net.*;
import java.awt.event.*;
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.setTitle("qq简易聊天,服务器端");
		this.setSize(300,200);
		this.setVisible(true);
		
		//服务器监听
		try {
			ServerSocket ss=new ServerSocket(9999);
			//等待客户的连接
			Socket s=ss.accept();
			
			
			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) {
			// TODO: handle exception
			e.printStackTrace();
		}
	;
		
	}

	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		//如果按下了发送按钮
		if(arg0.getSource()==jb)
			
		{
			//把服务器jtf写的内容发送给客户端
			String info=jtf.getText();
			
			jta.append("服务器对客户端说: "+info+"\r\n");
			pw.println(info);
			
			//清空发送框的内容
			jtf.setText("");
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值