网络编程

IP:(Internet Protocol)

唯一标识网络上的每一台计算机
当前网络环境中当前主机的唯一标识

IP组成:
32位,由4个8位二进制数组成
IP地址:网络地址+主机地址
网络地址:标识计算机或网络设备所在的网络
主机地址:标识特定主机或网络设备

IP地址的配置和检测

查看本机的IP地址
ipconfig
测试网络是否通畅
ping 目标IP地址

Socket:

通信链路的端点就被称为“套接字”(英文名Socket)
是提供给应用程序的接口
基于TCP协议的Socket编程
基于TCP协议的Socket网络通信
用来实现双向安全连接网络通信

Socket通信模型
进行网络通信时,Socket需要借助数据流来完成数据的传递工作

Socket网络编程一般可以分成如下步骤进行

1.建立连接
2.打开Socket关联的输入输出流
3.数据流中读写信息
4.关闭所有的数据流和Socket

以下为代码示例:

//服务端
public class Server {
	public static void main(String[] args) throws Exception {
		ServerSocket sso = new ServerSocket(50002);
		
		Socket socket = sso.accept();
		System.out.println("连接成功");
		
		final BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		final PrintWriter  pw= new PrintWriter(socket.getOutputStream());
		final BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						System.out.println("客户说:" + br.readLine());
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();

		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					String str;
					try {
						str = input.readLine();
						pw.println(str);
						pw.flush();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}).start();
	}
}
//客户端
public class Client {
	public static void main(String[] args) throws Exception {
		Socket socket = new Socket("localhost", 50002);

		final BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		final PrintWriter pw = new PrintWriter(socket.getOutputStream());
		final BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						System.out.println("服务说:" + br.readLine());
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					String str;
					try {
						str = input.readLine();
						pw.println(str);
						pw.flush();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();
	}
}

多线程处理多请求

采用多线程的方式
一个专门负责监听的应用主服务程序
一个专门负责处理请求的线程程序

以下为代码示例:

//用户类
public class User implements Serializable {
	private String userName;
	private String passWord;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassWord() {
		return passWord;
	}
	public void setPassWord(String passWord) {
		this.passWord = passWord;
	}
	public User() {
		super();
	}
	public User(String userName, String passWord) {
		super();
		this.userName = userName;
		this.passWord = passWord;
	}
}

//处理请求的线程
public class LoginRunnable implements Runnable {
	private Socket scoket;
	
	
	public LoginRunnable() {
		super();
		// TODO Auto-generated constructor stub
	}

	public LoginRunnable(Socket scoket) {
		super();
		this.scoket = scoket;
	}

	@Override
	public void run() {
		try {
			ObjectInputStream ois = new ObjectInputStream(scoket.getInputStream());
			
			PrintWriter pw = new PrintWriter(scoket.getOutputStream());
			
			User user = (User)ois.readObject();
			if(user!=null){
				pw.println(user.getUserName()+"登录成功");
				pw.flush();
			}else{
				pw.println("登录失败");
				pw.flush();
			}
			pw.close();
			ois.close();
			scoket.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	
}
//服务类
public class LoginServer {
		public static void main(String[] args) throws Exception {
			//1:创建serversocket对象
			ServerSocket sso = new ServerSocket(50001);
			//2.调用accpet方法建立连接
			while(true){
				Socket socket = sso.accept();
				//3.包装流对象
				LoginRunnable lr = new LoginRunnable(socket);
				
				new Thread(lr).start();
			}
			
		}
}
//客户类
public class LoginNew {
	public static void main(String[] args) throws Exception {
		Socket scoket = new Socket("127.0.0.1",50001);
		
		User user = new User("admin123","456789");
		
		ObjectOutputStream oos = new ObjectOutputStream(scoket.getOutputStream());
		
		BufferedReader br = new BufferedReader(new InputStreamReader(scoket.getInputStream()));
		
		oos.writeObject(null);
		
		System.out.println(br.readLine());
		
	}
}	
//客户类
public class Login {
	public static void main(String[] args) throws Exception {
		Socket scoket = new Socket("127.0.0.1",50001);
		
		User user = new User("admin","123456");
		
		ObjectOutputStream oos = new ObjectOutputStream(scoket.getOutputStream());
		
		BufferedReader br = new BufferedReader(new InputStreamReader(scoket.getInputStream()));
		
		oos.writeObject(user);
		
		System.out.println(br.readLine());
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值