java socket怎么写客户端向服务器发一堆话,服务器可以反馈发送的信息

OMRG 2017-04-30 10:21:43
客户端
import java.io.*;
import java.net.*;
import java.util.Scanner;
class Receive implements Runnable
{
private Socket Read;
private DataInputStream input=null;
public Receive(Socket R) throws IOException
{
Read=R;
input=new DataInputStream(Read.getInputStream());
}
@Override
public void run()
{
String r;
try
{
while((r=input.readLine())!=null)
{
System.out.println(r);
}
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
Read.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
public class Client
{
private Socket connection;
private PrintWriter output;
private DataInputStream input;
public void connect(InetAddress add) throws IOException
{
connection=new Socket(add,Server.port);
}
public void start() throws IOException
{
output=new PrintWriter(connection.getOutputStream());
input=new DataInputStream(connection.getInputStream());
Scanner s=new Scanner(System.in);
Receive receive=new Receive(connection);
Thread t=new Thread(receive);
t.start();
String send;
while(true)
{
send=s.nextLine();
output.write(send);
output.flush();
if(send.equals("end"))
break;
}
}
public static void main(String[] args) throws IOException
{
Client c=new Client();
c.connect(InetAddress.getLoopbackAddress());
c.start();
}
}

服务器
import java.io.*;
import java.net.*;
import java.util.ArrayList;
class ServerThread extends Thread
{
private Socket ThisSocket=null;
private PrintWriter output=null;
private DataInputStream input=null;
public ServerThread(Socket This) throws IOException
{
ThisSocket=This;
output=new PrintWriter(ThisSocket.getOutputStream());
input=new DataInputStream(ThisSocket.getInputStream());
}
public void run()
{
String recv;
try
{
while((recv=input.readLine())!=null)
{

System.out.println("客户端发来信息:"+recv);
output.write("服务器端已接受信息"+recv);
if(recv.equals("end"));
break;
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
input.close();
output.close();
Server.socketgroup.remove(ThisSocket);
ThisSocket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
public class Server
{
private ServerSocket server;
public static ArrayList<Socket> socketgroup;
public static final int port=1920;
public Server() throws IOException
{
server=new ServerSocket(port);
socketgroup=new ArrayList<Socket>();
}
public void running() throws IOException
{
while(true)
{
Socket connection=server.accept();
socketgroup.add(connection);
new ServerThread(connection).start();
}
}
public static void main(String[] args) throws IOException
{
new Server().running();
}
}


错哪里。。一直Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.DataInputStream.readLine(Unknown Source)
at ServerThread.run(Server.java:22)
...全文
529 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
OMRG 2017-05-01
  • 打赏
  • 举报
回复
嗯嗯,我看看
MikeDDT009 2017-05-01
  • 打赏
  • 举报
回复
引用 4 楼 yanhanwen123 的回复:
嗯嗯,我看看
只看里面加了序号的1 2 3 4这4步估计就差不多了
MikeDDT009 2017-04-30
  • 打赏
  • 举报
回复
好吧,你自己看我给你代码里面加上的序号吧,貌似直接里面变色不行。总共分了4步
MikeDDT009 2017-04-30
  • 打赏
  • 举报
回复
表示有地方看不明白,比如InetAddress这个类吧不过大概意思还是知道,你这里有个问题那就是,假如连接成功的话,总要有一方先发一个消息,然后才能有个反馈。不然开了连接上两个都没有反应不就尴尬了,那么如果没有任何其它按钮或者其它让一方先开口,那就一直发呆状态。 你这个像是连接没有成功,不如客户端写一个死的IP来连接(本地127.0.0.1)。 我的写的是死的 服务端:
	public static void main(String[] args) throws IOException {
		
		//开启服务器,并且端口为8888
		ServerSocket server = new ServerSocket(8888);
		System.out.println("开始监听");
		//监听客户端
		Socket client = server.accept();
		//获取客户端对象流
		//输出流
		System.out.println(client);
		ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
		//输入流
		ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
		//给客户端发送消息(1.这里是服务器先给客户端发送一个消息,消息的类型是字符串形式,这里注意类型
		oos.writeObject("已连接");
		//定义对象接收客户端信息
		Object obj = null;
		//开始接收
		while ((obj = ois.read()) != null) {
			4.服务器接收到了消息,然后判断,的确是这个类型,就正常执行,然后发送会去的也是Message类型了
			if (obj instanceof Message) {
				Message mes = (Message)obj;
				//创建一个返回的信息
				Message returnMessage = null;
				switch (mes.messageStyle) {
				case 0 :
					//要返回的信息
					returnMessage = new Message();
					returnMessage.setMessage("请选择要办理的业务\n1.查询话费\n2.查询流量");
					oos.writeObject(returnMessage);
				break;
				case 1 :
					//要返回的信息
					returnMessage = new Message();
					returnMessage.setMessage("你的话费余额是:300\n1.查询话费\n2.查询流量");
					oos.writeObject(returnMessage);
					break;
				
			}
客户端:
	public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {
		
		//关联服务器
		Socket client = new Socket("127.0.0.1", 8888);
		//获取与服务器的对象流
		//输入流
		ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
		//输出流
		ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());

		//定义变量用于接收服务器输入
		Object obj = null;
		
                 while ((obj = ois.readObject()) != null) {
			2.这边开始接收到服务器发送的消息了,这里就	判断了下,明显消息不算Message类型,于是进入下面的语句
			if (obj instanceof Message) {
				
				Message mes = (Message)obj;
				//输入
				Scanner input = null;
				String key = null;
				
				switch (mes.messageStyle) {
				case 0:
					//输出菜单
					System.out.println(mes.getMessage());
					input = new Scanner(System.in);
					//输入选择
					System.out.println("请输入选择");
					key = input.next();
					//判断
					switch (key) {
					case "1":
						//建立一个新的消息
						Message returnMessage = new Message();
						returnMessage.messageStyle = 1;
						oos.writeObject(returnMessage);
						break;

					default:
						break;
					}

					break;
				case 1 :
					System.out.println(mes.getMessage());
					System.out.println("请输入选择:");
					input = new Scanner(System.in);
					break;
				}
				
			3.于是客户端就执行这一段语句了,这里的话我是把上面一个本该执行的丢在下面,为了给服务器又发个消息,接下来就算服务器接收到了,注意我最后发送的消息类型
			}else {
				
				Scanner input = new Scanner(System.in);
				System.out.println("请输入选择");
				String key = input.next();
				if (key.equals("1")) {
					Message returnMessage = new Message();
					returnMessage.messageStyle = 1;
					oos.writeObject(returnMessage);
				}
				
			}
		
		}
	
		
客户端这边发送的消息:
public class Message implements Serializable{

	//业务类型0表示需要查询的消息1表示查询话费2表示查询流量
	public int messageStyle = 0;
	//发送消息的具体内容
	private String message;

	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	
}
最后就形成了一个循环,你发我收,我收你发。
OMRG 2017-04-30
  • 打赏
  • 举报
回复
我就是想让 客户端给服务器发信息,服务器接收到了可以反馈一个信息给客户端

50,527

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧