Java 网络编程

基于TCP协议下的网络编程:


获取本地主机地址

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * 测试InetAddress类
 * @author 30869
 *
 */
public class Test_InetAddress {

	public static void main(String[] args) {
		try {
			InetAddress address=InetAddress.getLocalHost();//获取表示本地主机的InetAddress对象
			System.out.println("本地主机地址是:"+address);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		
	}

}

传输字符串

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 测试Socket客户端
 * @author 30869
 *
 */
public class TestSocket {

	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket=new Socket("localhost", 8800);//创建客户端Socket连接,指定服务器的位置为本机和8800端口
		InputStream is=socket.getInputStream();//打开输入/输出流
		OutputStream os=socket.getOutputStream();
		String info="用户名:李林,密码:123456";//发送客户端登录信息,即向输出流写入信息
		os.write(info.getBytes());
		socket.shutdownOutput();
		String reply=null;//接受服务器响应,即从输入流读取信息
		BufferedReader br=new BufferedReader(new InputStreamReader(is));
		while(!((reply=br.readLine())==null)){
			System.out.println("我是客户端,服务器响应信息:"+reply);
		}
		is.close();//关闭资源
		os.close();
		socket.close();
		br.close();
	}

}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 测试ServerSocket服务器端
 * @author 30869
 *
 */
public class TestServerSocket {

	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket=new ServerSocket(8800);//建立一个服务器Socket(ServerSocket),指定端口8800并开始监听
		Socket socket=serverSocket.accept();//等待客户端触发通信
		InputStream is=socket.getInputStream();//打开输入输出流
		OutputStream os=socket.getOutputStream();
		String info=null;//获取客户端信息,即从输入流读取信息
		//InputStreamReader()转换流,字节转字符
		BufferedReader br=new BufferedReader(new InputStreamReader(is));
		while(!((info=br.readLine())==null)){
			System.out.println("我是服务器,客户登录信息为:"+info);
		}
		String reply="欢迎你,登录成功!";//给客户端一个响应,即从输出流写入信息
		os.write(reply.getBytes());
		serverSocket.close();//关闭资源
		socket.close();
		is.close();
		os.close();
		br.close();
	}

}

传输对象

import java.io.Serializable;

/**
 * 序列化用户类
 * @author 30869
 *
 */
public class User implements Serializable{

	private String uName;//用户名
	private String pwd;//密码
	
	public User() {
		super();
	}

	public User(String uName, String pwd) {
		super();
		this.uName = uName;
		this.pwd = pwd;
	}

	public String getuName() {
		return uName;
	}

	public void setuName(String uName) {
		this.uName = uName;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

/**
 * 客户端
 * @author 30869
 *
 */
public class Client {

	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket=new Socket("localhost", 8800);//建立客户端Socket连接,指定服务器位置和端口
		OutputStream os=socket.getOutputStream();//打开输入/输出流
		InputStream is=socket.getInputStream();
		ObjectOutputStream oos=new ObjectOutputStream(os);//对象序列化
		List<User> users=new ArrayList<User>();//添加对象数据
		users.add(new User("李林", "123456"));
		users.add(new User("杨英", "654321"));
		users.add(new User("周星驰", "158312"));
		users.add(new User("叶问", "851236"));
		users.add(new User("李连杰", "741852"));
		oos.writeObject(users);//写入数据
		//禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。
		//如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException
		socket.shutdownOutput();
		BufferedReader br=new BufferedReader(new InputStreamReader(is));//读取服务器响应信息
		String reply=null;
		while(!((reply=br.readLine())==null)){
			System.out.println("我是客户端:服务器响应信息为:"+reply);
		}
		br.close();//关闭资源
		oos.close();
		os.close();
		is.close();
		socket.close();
	}

}
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import com.lilin.testSocket_ServerSocket_Object.User;

/**
 * 服务器端
 * 
 * @author 30869
 *
 */
public class Server {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		ServerSocket serverSocket = new ServerSocket(8800);// 指定端口8800并开始监听
		Socket socket = serverSocket.accept();// 等待客户端触发通信
		InputStream is = socket.getInputStream();// 打开输入/输出流
		OutputStream os = socket.getOutputStream();
		ObjectInputStream ois = new ObjectInputStream(is);// 对象反序列化
		List<User> users = new ArrayList<User>();
		users = (List<User>) ois.readObject();// 读取客户端信息
		if (!(users == null)) {//先判断客户端是否发出请求
			System.out.println("我是服务器:客户端登录信息如下:");
			for (User user : users) {
				System.out.println("用户名:" + user.getuName() + "\t密码:" + user.getPwd());
			}
		}
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));// 给客户端响应
		bw.write("登录人数:" + users.size() + "人");
		bw.close();// 关闭资源
		ois.close();
		os.close();
		is.close();
		socket.close();
		serverSocket.close();
	}

}

多个客户端访问服务器

import java.io.Serializable;

/**
 * 序列化用户类
 * @author 30869
 *
 */
public class User implements Serializable{

	private String uName;//用户名
	private String pwd;//密码
	
	public User() {
		super();
	}

	public User(String uName, String pwd) {
		super();
		this.uName = uName;
		this.pwd = pwd;
	}

	public String getuName() {
		return uName;
	}

	public void setuName(String uName) {
		this.uName = uName;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
}

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
 * 服务端线程
 * @author 30869
 *
 */
import java.util.Scanner;
public class LoginThread extends Thread {
	Socket socket = null;
	OutputStream os = null;
	InputStream is = null;
	ObjectInputStream ois = null;
	BufferedWriter bw = null;
	Scanner scanner=new Scanner(System.in);
	//每启动一个线程,连接对应的Socket
	public LoginThread(Socket socket) {
		super();
		this.socket = socket;
	}
	//启动线程,即响应客户端请求
	public void run() {
		try {
			os = socket.getOutputStream();
			is = socket.getInputStream();
			ois = new ObjectInputStream(is);
			
			List<User> users = new ArrayList<User>();
			users = (List<User>) ois.readObject();
			StringBuffer sb = new StringBuffer();//用于存储响应信息
			if (!(users == null)) {
				System.out.println("我是服务器:客户端请求信息如下:");
				for (User user : users) {
					System.out.println("用户名:" + user.getuName() + "\t密码" + user.getPwd());
					sb.append(user.getuName() + "已登录\n");
				}
			}
			bw = new BufferedWriter(new OutputStreamWriter(os));
			bw.write(sb.toString());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				bw.close();
				ois.close();
				is.close();
				os.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}

	}
}

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服务器端
 * @author 30869
 *
 */
public class Server {

	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket=new ServerSocket(8800);//建立服务器Socket(SeverSocket),指定端口并开始监听
		Socket socket=null;
		//监听一直进行
		while(true){
			socket=serverSocket.accept();//等待客户端触发通信
			LoginThread loginThread=new LoginThread(socket);
			loginThread.start();
		}
	}

}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

/**
 * 客户端
 * @author 30869
 *
 */
public class Client2 {

	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket=new Socket("localhost", 8800);//建立客户端Socket连接,指定服务器位置和端口
		OutputStream os=socket.getOutputStream();//打开输入/输出流
		InputStream is=socket.getInputStream();
		ObjectOutputStream oos=new ObjectOutputStream(os);//对象序列化
		List<User> users=new ArrayList<User>();//添加对象数据
		users.add(new User("黎明", "123456"));
		users.add(new User("张学友", "654321"));
		users.add(new User("周星驰", "158312"));
		users.add(new User("刘德华", "851236"));
		users.add(new User("李连杰", "741852"));
		oos.writeObject(users);//写入数据
		//禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。
		//如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException
		socket.shutdownOutput();
		BufferedReader br=new BufferedReader(new InputStreamReader(is));//读取服务器响应信息
		String reply=null;
		System.out.println("我是客户端:服务器响应信息为:");
		while(!((reply=br.readLine())==null)){
			System.out.println(reply);
		}
		br.close();//关闭资源
		oos.close();
		os.close();
		is.close();
		socket.close();
	}

}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

/**
 * 客户端
 * @author 30869
 *
 */
public class Client {

	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket=new Socket("localhost", 8800);//建立客户端Socket连接,指定服务器位置和端口
		OutputStream os=socket.getOutputStream();//打开输入/输出流
		InputStream is=socket.getInputStream();
		ObjectOutputStream oos=new ObjectOutputStream(os);//对象序列化
		List<User> users=new ArrayList<User>();//添加对象数据
		users.add(new User("李林", "123456"));
		users.add(new User("杨英", "654321"));
		users.add(new User("周星驰", "158312"));
		users.add(new User("叶问", "851236"));
		users.add(new User("张学友", "741852"));
		oos.writeObject(users);//写入数据
		//禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。
		//如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException
		socket.shutdownOutput();
		BufferedReader br=new BufferedReader(new InputStreamReader(is));//读取服务器响应信息
		String reply=null;
		System.out.println("我是客户端:服务器响应信息为:");
		while(!((reply=br.readLine())==null)){
			System.out.println(reply);
		}
		br.close();//关闭资源
		oos.close();
		os.close();
		is.close();
		socket.close();
	}

}

基于UDP协议的网络编程:

/**
 * 发送端
 */
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Send {

	public static void main(String[] args) {
		InetAddress ia=null;//主机地址引用
		DatagramSocket ds=null;//DatagramSocket引用
		String msgs="你好,哪位?";
		System.out.println("我说:"+msgs);//显示与本地对话框
		try {
			ia=InetAddress.getByName("localhost");//获取主机地址
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		//创建DatagramPacket对象,封装数据
		DatagramPacket dp=new DatagramPacket(msgs.getBytes(), msgs.getBytes().length,ia,8800);
		try {
			ds=new DatagramSocket();//创建DatagramSocket对象
		
		} catch (SocketException e) {
			e.printStackTrace();
		}
		try {
			ds.send(dp);//向服务器发送数据
		} catch (IOException e) {
			e.printStackTrace();
		}
		//接收服务器响应
		byte[] buf=new byte[1024];
		DatagramPacket dprp=new DatagramPacket(buf, 1024);
		try {
			ds.receive(dprp);
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			ds.close();//关闭DatagramSocket对象
		}
		String reply=new String(dprp.getData(),0,dprp.getLength());//取出信息
		System.out.println(dp.getAddress().getHostAddress()+"说:"+reply);
			
	}

}

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;
import java.net.SocketException;
/**
 * 接收端
 * @author 30869
 *
 */
public class Receive {

	public static void main(String[] args) {
		DatagramSocket ds=null;//创建DatagramSocket引用
		byte[] buf=new byte[1024];
		//创建DatagramPacket对象,用来准备接收数据包
		DatagramPacket dp=new DatagramPacket(buf, 1024);
		try {
			ds=new DatagramSocket(8800);//创建DatagramSocket对象,指定端口
		} catch (SocketException e) {
			e.printStackTrace();
		}
		try {
			ds.receive(dp);//接收数据,放入dp
		} catch (IOException e) {
			e.printStackTrace();
		}
		String msgs=new String(dp.getData(), 0, dp.getLength());//取出数据信息
		System.out.println(dp.getAddress().getHostAddress()+"说:"+msgs);
		//向客户端发送响应信息
		String reply="我是李林";
		System.out.println("我说:"+reply);//显示与本地对话框
		//SocketAddress类,供套接字用于绑定、连接或用作返回值
		//getSocketAddress(),获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。
		SocketAddress sa=dp.getSocketAddress();
		//创建DatagramPacket对象,封装数据
		DatagramPacket dpto=new DatagramPacket(reply.getBytes(), reply.getBytes().length,sa);
		try {
			ds.send(dpto);//发送
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			ds.close();//关闭DatagramSocket对象
		}
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值