java io,socket

本文介绍如何使用Java编写网络通信程序,并通过Socket实现客户端与服务器间的交互,包括发送和接收数据流程。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;



public class Login extends JFrame implements ActionListener{
	 JTextField txtUser = new JTextField();
  	 JPasswordField txtPass = new JPasswordField();
	 JButton loginBtn = new JButton("登陆");
	 JButton registerBtn = new JButton("注册");
	 JButton exitBtn = new JButton("退出");
	
	Login(){
		this.setSize(250,125);
		JPanel upPanel = new JPanel();
		upPanel.setLayout(new GridLayout(2,2));
		JLabel labUser = new JLabel("用户名");
		JLabel labPass = new JLabel("密码");
		upPanel.add(labUser);
		upPanel.add(txtUser);
		upPanel.add(labPass);
		upPanel.add(txtPass);

		JPanel downPanel = new JPanel();
		downPanel.setLayout(new FlowLayout());
		downPanel.add(loginBtn);
		downPanel.add(registerBtn);
		downPanel.add(exitBtn);

		this.setLayout(new BorderLayout());
		this.add(upPanel,BorderLayout.CENTER);
		this.add(downPanel,BorderLayout.SOUTH);

		loginBtn.addActionListener(this);
		registerBtn.addActionListener(this);
		exitBtn.addActionListener(this);
		
	}


	public static void main(String args[]){
		JFrame   m = new Login();
		m.setVisible(true);

	}

	public void actionPerformed(ActionEvent arg0){
		if(arg0.getActionCommand().equals("登陆")){
			String  u = txtUser.getText();
			String  p = txtPass.getText();
			String up = u+"%"+p;
			try{
				Socket s = new Socket("localhost",8000);
				OutputStream os = s.getOutputStream();
				OutputStreamWriter osr = new OutputStreamWriter(os);
				PrintWriter pw = new PrintWriter(osr,true);
				pw.println(up);
				

				
				InputStream is = s.getInputStream();
				InputStreamReader isr = new InputStreamReader(is);
				BufferedReader br = new BufferedReader(isr);
				String flag = br.readLine();
				if(flag.equals("true")){
					JFrame m = new QQMain();
					m.setVisible(true);
				}	
				else{
					JOptionPane.showMessageDialog(this,"登陆失败请重新登陆");
				}
			
				
			}
			catch(Exception e){
 				e.printStackTrace();
			}
		}
		if(arg0.getActionCommand().equals("注册")){
			System.out.println("注册");
		}
		if(arg0.getActionCommand().equals("退出")){
			System.out.println("退出");
		}

	}


}
上面的PrintWriter pw = new PrintWiter(osr,true);   会直接刷新流 ;
   但是 如果写成  PrintWritr pw= new PrintWriter(osr);  pw.println(flag) ; pw.close(); 则会报错  说socket被关闭 .
这个有点不懂 查了PrintWriter 的close方法  
		
     public void <strong>close</strong>()
<dl><dd>关闭该流并释放与之关联的所有系统资源。关闭以前关闭的流无效。</dd></dl>

为什么socket也被关闭了??

Java中,`Socket`编程是一种网络通信方式,它允许两台计算机通过网络进行数据交换。`Socket`通常分为客户端和服务器端。下面是一个简单的例子,展示如何使用Java的`IO`和`Socket`创建一个基本的服务器-客户端应用程序。 ### 服务器端代码 ```java import java.io.*; import java.net.*; public class EchoServer { public static void main(String[] args) throws IOException { // 监听端口 4444 ServerSocket serverSocket = new ServerSocket(4444); Socket clientSocket = serverSocket.accept(); // 等待客户端连接 // 获取输入输出流 PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String inputLine; // 循环读取客户端发送的消息并回显 while ((inputLine = in.readLine()) != null) { if ("bye".equals(inputLine)) { out.println("Goodbye!"); break; } out.println("Echo: " + inputLine); } // 关闭资源 in.close(); out.close(); clientSocket.close(); serverSocket.close(); } } ``` ### 客户端代码 ```java import java.io.*; import java.net.*; public class EchoClient { public static void main(String[] args) throws IOException { // 连接到本地主机上的服务器 Socket socket = new Socket("localhost", 4444); // 获取输入输出流 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String userInput; // 循环从标准输入读取用户输入,并发送到服务器 while ((userInput = stdIn.readLine()) != null) { out.println(userInput); System.out.println("Server response: " + in.readLine()); } // 关闭资源 out.close(); in.close(); stdIn.close(); socket.close(); } } ``` ### 解释: 1. **服务器端**: - 创建一个`ServerSocket`对象,监听端口4444。 - 使用`accept()`方法等待客户端连接。 - 当客户端连接后,创建`PrintWriter`和`BufferedReader`来处理输入输出。 - 服务器读取客户端发送的消息,并将其回显给客户端,直到收到"bye"消息。 2. **客户端**: - 创建一个`Socket`对象,连接到服务器(这里假设服务器在同一台机器上运行)。 - 使用`PrintWriter`和`BufferedReader`与服务器进行通信。 - 从标准输入读取用户输入,并将其发送到服务器,同时接收服务器的响应。 ### 注意事项: - 在实际应用中,需要考虑异常处理、线程安全等问题。 - 以上代码只是一个基础示例,实际项目中可能需要更复杂的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值