客户端:
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;/*** 客户端*/
public class TcpClient {public static void main(String[] args) {/*** 6.因为在关闭资源的时候,作用域不够* 为了提升作用域,将变量在方法外部就先赋值*/Socket socket = null;OutputStream outputStream = null;try {//1.要知道服务器的IP和端口号InetAddress serverIp = InetAddress.getByName("127.0.0.1");int port = 9999;//2. 创建一个socket连接,参数为服务端的IP和端口socket = new Socket(serverIp,port);//3. 发送消息,利用IO流发送消息outputStream = socket.getOutputStream();//4. 输入具体的发送内容并进行转化outputStream.write("你好,欢迎学习".getBytes());} catch (Exception e) {e.printStackTrace();} finally {//5.遵循先开后关的原则,从下到上关闭//5.但直接关闭会出现作用域不够的爆红的问题,因此需要在最开始提升作用域
// outputStream.close();
// socket.close();//7. 提升作用域之后,一个个进行判断后再关闭if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}
顺序:
- 要知道服务器的IP和端口号
- 创建一个socket连接,参数为服务端的IP和端口
- 发送消息,利用IO流发送消息
- 输入具体的发送内容并进行转化
- 遵循先开后关的原则,从下到上关闭,但直接关闭会出现作用域不够的爆红的问题,因此需要在最开始提升作用域
- 因为在关闭资源的时候,作用域不够,为了提升作用域,将变量在方法外部就先赋值
- 提升作用域之后,一个个进行判断后再关闭
2.创建一个socket连接,参数为服务端的IP和端口(这里注释写错了,这里应该是客户端)
服务端:
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** 服务端*/
public class TcpServer {public static void main(String[] args) {/*** 6.为了避免关闭时候爆红,在这里进行作用域的提升* 为了提升作用域,将变量在方法外部就先赋值*/ServerSocket serverSocket = null;Socket accept = null;InputStream is = null;ByteOutputStream baos = null;// Ctrl + Alt + T 抛出异常try {//1.客户端先得有一个地址serverSocket = new ServerSocket(9999);//2.等待客户端连接 调用accept()进行监听,这里的accept就是客户端里保存了端口号和IP地址的socket变量accept = serverSocket.accept();//3. 读取客户端的消息is = accept.getInputStream();//4.使用管道流baos = new ByteOutputStream();byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {baos.write(buffer,0,len);}System.out.println(baos.toString());} catch (IOException e) {e.printStackTrace();} finally {//5.关闭遵循先开关的原则,意思就是从下往上关//5.但会爆红,为了避免这种情况,在最开始提升作用域
// baos.close();
// is.close();
// accept.close();
// serverSocket.close();//7.提升作用域之后,一个个进行判断后再关闭if (baos != null) {try {baos.close();} catch (Exception e) {e.printStackTrace();}}if (is!= null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}if (accept != null) {try {accept.close();} catch (IOException e) {e.printStackTrace();}}if (serverSocket != null) {try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}
}
顺序:
- 客户端先得有一个地址
- 等待客户端连接 调用accept()进行监听,这里的accept就是客户端里保存了端口号和IP地址的socket变量
- 读取客户端的消息
- 使用管道流
- 关闭遵循先开关的原则,意思就是从下往上关,但会爆红,为了避免这种情况,在最开始提升作用域
- 为了避免关闭时候爆红,在这里进行作用域的提升,为了提升作用域,将变量在方法外部就先赋值
- 提升作用域之后,一个个进行判断后再关闭
最后,先启动服务端,再启动客户端,控制台如下