Java-网络编程(2)

代码部分

服务器端获取客户端字符串

Server1.java

/**
 * 演示客户端连接(服务器端)
 * @author soft01
 */
public class Server1 {

	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(6666);
		Socket socket = ss.accept();
		//当客户端发起请求时才会响应
		//获取服务器端IP地址
		System.out.println("服务器LocalAddress:" + socket.getLocalAddress()); //服务器LocalAddress:/127.0.0.1
		//获取服务器端端口号
		System.out.println("服务器LocalPort:" + socket.getLocalPort()); //服务器LocalPort:6666
		//获取客户端地址
		System.out.println("客户端InetAddress:" + socket.getInetAddress()); //客户端InetAddress:/127.0.0.1
		//获取客户端端口号
		System.out.println("客户端Port:" + socket.getPort()); //客户端Port:41704 随机
		
		InputStream is = socket.getInputStream();
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		String str = br.readLine(); //readLine():表示按行读取【客户端中println必须加ln,否则读取不到报错null!】
		System.out.println("收到客户端发来的消息:" + str);
		
		socket.close();
	}
	
}

Client1.java

/**
 * 演示服务器端连接(客户端)
 * @author soft01
 */
public class Client1 {

	public static void main(String[] args) throws Exception {
		Socket socket = new Socket("127.0.0.1", 6666);
		//获取服务器端IP地址
		System.out.println("服务器LocalAddress:" + socket.getLocalAddress()); //服务器LocalAddress:/127.0.0.1
		//获取服务器端端口号
		System.out.println("服务器LocalPort:" + socket.getLocalPort()); //服务器LocalPort:41704 随机
		//获取客户端地址
		System.out.println("客户端InetAddress:" + socket.getInetAddress()); //客户端InetAddress:/127.0.0.1
		//获取客户端端口号
		System.out.println("客户端Port:" + socket.getPort()); //客户端Port:6666
		
		//通过socket去获取输出流,返回类型是OutputStream类型
		OutputStream os = socket.getOutputStream();
		//OutputStreamWriter:表示用来接收os,并且设置字符集编码(utf-8)【目的为了防止出现乱码】
		OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
		BufferedWriter bw = new BufferedWriter(osw);
		//打印流:按行写字符串,并且自动刷新,默认是false,是不刷新的
		PrintWriter pw = new PrintWriter(bw, true);
		pw.println("服务端,你好!");
		
		//关流!
		socket.close();
	}

}

练习:

客户端输入到控制台字符串,服务器端获取
注:客户端可多次在控制台输入字符串,即:客户端可给服务器端进行通信

Server2.java

/**
 * 演示服务器端连接(客户端)
 * @author soft01
 */
public class Client1 {

	public static void main(String[] args) throws Exception {
		Socket socket = new Socket("127.0.0.1", 6666);
		//获取服务器端IP地址
		System.out.println("服务器LocalAddress:" + socket.getLocalAddress()); //服务器LocalAddress:/127.0.0.1
		//获取服务器端端口号
		System.out.println("服务器LocalPort:" + socket.getLocalPort()); //服务器LocalPort:41704 随机
		//获取客户端地址
		System.out.println("客户端InetAddress:" + socket.getInetAddress()); //客户端InetAddress:/127.0.0.1
		//获取客户端端口号
		System.out.println("客户端Port:" + socket.getPort()); //客户端Port:6666
		
		//通过socket去获取输出流,返回类型是OutputStream类型
		OutputStream os = socket.getOutputStream();
		//OutputStreamWriter:表示用来接收os,并且设置字符集编码(utf-8)【目的为了防止出现乱码】
		OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
		BufferedWriter bw = new BufferedWriter(osw);
		//打印流:按行写字符串,并且自动刷新,默认是false,是不刷新的
		PrintWriter pw = new PrintWriter(bw, true);
		pw.println("服务端,你好!");
		
		//关流!
		socket.close();
	}

}

Client2.java

/**
 * 演示服务器端连接(客户端)
 * @author soft01
 */
public class Client2 {

	public static void main(String[] args) throws Exception {
		Socket socket = new Socket("localhost", 7777);		
		
		OutputStream os = socket.getOutputStream();
		OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
		BufferedWriter bw = new BufferedWriter(osw);
		PrintWriter pw = new PrintWriter(bw, true);
		
		Scanner sc = new Scanner(System.in);
		while (true) {
			String msg = sc.nextLine();
			pw.println(msg);
		}
	}
	
}

注:统一局域网可访问,修改客户端中的IP地址,另一台电脑先开服务器,本机开客户端并在控制台输入字符串,另一台电脑会显示受到客户端发来信息。重新访问自己的本机地址须修改为localhost

聊天室客户端v1.0

指定ip地址和端口号进行访问

Server3.java

/**
 * 演示客户端连接(服务器端)
 * @author soft01
 */
public class Server3 {

	public static void main(String[] args) {
		try {
			System.out.println("服务器正在启动...");
			ServerSocket ss = new ServerSocket(9999);
			Socket socket = ss.accept();
			System.out.println("一个客户端已经连接了...");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

Client3.java

/**
 * 演示服务器端连接(客户端)
 * @author soft01
 */
public class Client3 {

	/**
	 * 主方法
	 * @param args
	 */
	public static void main(String[] args) {
		//创建本类对象,默认会去执行无参构造方法
		Client3 client = new Client3();
	}
	
	/**
	 * 无参构造方法
	 */
	public Client3() {
		System.out.println("无参构造方法已经执行...");
		
		/* 创建窗体 */
		JFrame jFrame = new JFrame("聊天室客户端v1.0版");
		
		//JOptionPane:有助于方便的弹出要求用户提供值或者是向它发出标准对话框
		//showInputDialog:提示要求输入内容 -提示语句
		String ip = JOptionPane.showInputDialog(jFrame, "请输入服务器的地址"); //获取ip
		String port = JOptionPane.showInputDialog(jFrame, "请输入端口号"); //获取端口号
		int port1 = Integer.parseInt(port);
		try {
			Socket socket = new Socket(ip, port1);
		} catch (Exception e) {
			//打印栈信息:如果出现异常信息,直接打印到控制台
			e.printStackTrace(); 
		}
		
		/* 内容准备 */
		JTextArea jTextArea = new JTextArea(20, 40); //构造具有指定行数(参数1)和列数(参数2)的JTextArea
		jTextArea.setFont(new Font("宋体",  Font.BOLD, 24)); //设置字体,指定字体为宋体,加粗,24号字
		jTextArea.setEditable(false); //设置聊天室窗口不可编辑
		JTextField jTextField = new JTextField(30); //创建文本输入框,行数(参数1)
		JButton jButton = new JButton("发送"); //创建发送按钮
		String name = JOptionPane.showInputDialog(jFrame, "请输入你的名字"); //获取访客名称
		JLabel jLabel = new JLabel(name + ":"); //创建标签
		
		/* 内容放入布局 */
		//JScrollPane:表示可滚动面板
		JScrollPane jScrollPane = new JScrollPane(jTextArea);
		//BorderLayout:表示网格布局【CENTER、EAST、WEST、SOURTH、NORTH】
		jFrame.add(jScrollPane, BorderLayout.CENTER); //将面板放入布局中
		JPanel jPanel = new JPanel(); //创建画笔
		jPanel.add(jLabel); //添加标签
		jPanel.add(jTextField); //添加文本输入框
		jPanel.add(jButton); //添加按钮
		jFrame.add(jPanel, BorderLayout.SOUTH); //将画笔放入布局中
		/*
		 * jPanel.add(jPanel, BorderLayout.SOUTH); 即将面板添加到面板当中,会报下面错误 
		 * Exception in thread "main" java.lang.IllegalArgumentException: adding container's parent to itself
		 * at cn.tedu.lt.Client3.<init>(Client3.java:63) 在第63行,没有进行初始化【需要init初始化方法,说明没有把面板添加到窗体中】
		 */
		
		/* 窗体设置 */
		jFrame.setSize(800, 600); //设置窗体大小
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置在关闭时不执行任何操作,关闭是指在控制台的关闭
		jFrame.setLocationRelativeTo(null); //设置窗体位置,默认为居中
		jFrame.setVisible(true); //设置可见
	}
	
//	private void init() {
//		
//	}
	
}

效果图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码优化

Server4.java

/**
 * 演示客户端连接(服务器端)
 * @author soft01
 */
public class Server4 {

	public static void main(String[] args) {
		try {
			System.out.println("服务器正在启动...");
			ServerSocket ss = new ServerSocket(9999);
			Socket socket = ss.accept();
			System.out.println("一个客户端已经连接了...");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

Client4.java

/**
 * 演示服务器端连接(客户端)
 * @author soft01
 */
public class Client4 {
	
	private final JFrame jFrame; //窗体
	
	/* 聊天内容 */
	private final JTextArea jTextArea; //文本域
	private final JTextField jTextField; //文本框
	private final JButton jButton; //按钮
	private final String name; //用户名
	private final JLabel jLabel; //标签
	
	private Socket socket; //地址ip会发生变化,不能用final

	/* tips:不能final声明 */
	private JScrollPane jScrollPane; //面板
	private JPanel jPanel; //画笔
	
	/**
	 * 主方法
	 * @param args
	 */
	public static void main(String[] args) {
		//创建本类对象,默认会去执行无参构造方法
		Client4 client = new Client4();
		client.showMe();
	}

	/**
	 * 无参构造方法
	 */
	public Client4() {
		System.out.println("无参构造方法已经执行...");

		/* 创建窗体 */
		jFrame = new JFrame("聊天室客户端v1.0版");

		//JOptionPane:有助于方便的弹出要求用户提供值或者是向它发出标准对话框
		//showInputDialog:提示要求输入内容 -提示语句
		String ip = JOptionPane.showInputDialog(jFrame, "请输入服务器的地址"); //获取ip
		String port = JOptionPane.showInputDialog(jFrame, "请输入端口号"); //获取端口号
		int port1 = Integer.parseInt(port);
		try {
			socket = new Socket(ip, port1);
		} catch (Exception e) {
			//打印栈信息:如果出现异常信息,直接打印到控制台
			e.printStackTrace(); 
		}

		/* 内容准备 */
		jTextArea = new JTextArea(20, 40); //构造具有指定行数(参数1)和列数(参数2)的JTextArea
		jTextArea.setFont(new Font("宋体",  Font.BOLD, 24)); //设置字体,指定字体为宋体,加粗,24号字
		jTextArea.setEditable(false); //设置聊天室窗口不可编辑
		jTextField = new JTextField(30); //创建文本输入框,行数(参数1)
		jButton = new JButton("发送"); //创建发送按钮
		name = JOptionPane.showInputDialog(jFrame, "请输入你的名字"); //获取访客名称
		jLabel = new JLabel(name + ":"); //创建标签
		
		init(); //初始化方法
	}
	
	/**
	 *  内容放入布局初始化方法
	 */
	private void init() {
		//JScrollPane:表示可滚动面板
		jScrollPane = new JScrollPane(jTextArea);
		//BorderLayout:表示网格布局【CENTER、EAST、WEST、SOURTH、NORTH】
		jFrame.add(jScrollPane, BorderLayout.CENTER); //将面板放入布局中
		jPanel = new JPanel(); //创建画笔
		jPanel.add(jLabel); //添加标签
		jPanel.add(jTextField); //添加文本输入框
		jPanel.add(jButton); //添加按钮
		jFrame.add(jPanel, BorderLayout.SOUTH); //将画笔放入布局中
	}

	/**
	 * 窗体设置方法(显示)
	 */
	private void showMe() {
		jFrame.setSize(800, 600); //设置窗体大小
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置在关闭时不执行任何操作,关闭是指在控制台的关闭
		jFrame.setLocationRelativeTo(null); //设置窗体位置,默认为居中
		jFrame.setVisible(true); //设置可见
	}
	
}

效果图同上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值