Java中Socket编程的简单示例

目标需求

实现一个简单的会说话的汤姆猫。

设计思路

通过Socket编程来简单实现服务器对客户端输入的数据加工,再输出到客户端。

实现代码
  • 服务器代码
package demo5.chatroom;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServiceTest {
	public static void main(String[] args) {
		//定义输出流dos
		DataOutputStream dos = null;
		//定义输入流dis
		DataInputStream dis = null;
		//实例化Socket
		Socket s1 = null;
		try {
			//实例化ServerSocket,并将端口8888给ServerSocket
			ServerSocket s = new ServerSocket(8888);
			System.out.println("服务端已经启动!");
			//当s1接到8888端口的请求
			s1 = s.accept();
			//获得到输出流地址
			dos = new DataOutputStream(s1.getOutputStream());
			//获得到输出流地址
			dis = new DataInputStream(s1.getInputStream());
			//定义Str存放数据
			String str = null;
			//接收信息
			while(true) {
				if((str = dis.readUTF()).equals("88")==false) {
					System.out.println("客户端输入姓名:" + str);
					dos.writeUTF("Tom said: " + str + "!");
				}else {
					dos.writeUTF("Tom said: " + str + "!");
					break;
				}
				
			}
		} catch (IOException e) {
			System.out.println("服务端启动失败!");
			e.printStackTrace();
		}finally{
			try {
				//关闭输入输出流
				dis.close();
				dos.close();
				//关闭连接
				s1.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
  • 客户端代码
package demo5.chatroom;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class ClientTest {
	public static void main(String[] args) {
		//定义输出流dos
		DataOutputStream dos = null;
		//定义输入流dis
		DataInputStream dis = null;
		//实例化socket
		Socket socket = null;
		String s = null;
		try {
			//实例化socket,端口号为8888,ip为localhost,建立连接
			socket = new Socket("localhost", 8888);
			//获得到输出流地址
			dos = new DataOutputStream(socket.getOutputStream());
			//获得到输出流地址
			dis = new DataInputStream(socket.getInputStream());
			 while(true ){
				System.out.println("I said:");
				//从控制台获取输入
				Scanner input = new Scanner(System.in);
				String name = input.next();
				// 客户端向服务器端发送请求的内容
				dos.writeUTF(name);
				dos.flush();
				if((s = dis.readUTF()).equals("Tom said: 88!")==false ) {
					System.out.println(s);	
				}else {
					System.out.println(s);	
					break;
				}
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				//关闭输入输出流
				dis.close();
				dos.close();
				//关闭连接
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
遇到的问题以及自己的理解

开始实现时候,因为在服务器的循环的判断中,对IO和Socket没有很好的理解,使用这样的代码:
Java中Socket编程的简单示例_第1张图片
在else中没有写dos.writeUTF("Tom said: " + str + "!");这句,导致了出现java.io.EOFException这个错误,具体如下图:
Java中Socket编程的简单示例_第2张图片
通过百度得知有可能是dis或者dos其中一个关闭了,而另一个却没有,导致出现这种错误。Java socket中关闭IO流的情况。
仔细研究了一下代码,我认为如果我没有写dos.writeUTF("Tom said: " + str + "!");,代码继续执行,执行到后面把输入输出流关闭,导致在客户端的代码之中(s = dis.readUTF())获取不到我们想传输的数据,所以报错。

如果您在阅读之中发现文章错误之处或者出现疑问,欢迎在评论指出

你可能感兴趣的:(Java)