Java套接字:我的服务器输入流不会从客户端输出流中读取?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java套接字:我的服务器输入流不会从客户端输出流中读取?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5700字,纯文字阅读大概需要9分钟。
内容图文
![Java套接字:我的服务器输入流不会从客户端输出流中读取?](/upload/InfoBanner/zyjiaocheng/731/7cc6eff491974842937763c245bdb0de.jpg)
编辑:我很长,但有谁知道如何编程套接字?
我的问题让我有些困惑.我有一台服务器在一台计算机上运行而在另一台计算机上运行,??我有一个客户端连接到它.当我从客户端键入消息到控制台并发送它时,服务器似乎没有收到它.任何人都知道为什么,因为我在过去的3个小时里一直在测试打印到控制台,并且无法解决这个问题.我对套接字比较新,所以如果我只是个白痴,不要太苛刻.
继承了我的客户端代码:
import java.net.*;
import java.util.Scanner;
import java.io.*;
public class SocketClient {
public static void main(String [] args) {
String host = "************";
int port = 25565;
StringBuffer instr = new StringBuffer();
String TimeStamp;
System.out.println("SocketClient initialized");
try {
InetAddress address = InetAddress.getByName(host);
Socket connection = new Socket(address, port);
BufferedOutputStream bos = new BufferedOutputStream(connection.getOutputStream());
OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII");
Scanner scan = new Scanner(System.in);
String message = scan.nextLine();
TimeStamp = new java.util.Date().toString();
String process = "Server called on " + host + ":" + port + " at " + TimeStamp + ": " + message + (char) 13;
osw.write(process);
osw.flush();
BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
InputStreamReader isr = new InputStreamReader(bis, "US-ASCII");
int c;
while ( (c = isr.read()) != 13)
instr.append( (char) c);
connection.close();
System.out.println(instr);
} catch (UnknownHostException e) {
System.err.println("UnknownHostException: " + e);
} catch (IOException e) {
System.err.println("IOExcepion: " + e);
}
}
}
以下是将客户端连接到服务器的代码:
import java.io.IOException;
import java.net.*;
public class MultipleSocketServer {
public static Socket connection;
public static String name = "Tyler's Server";
public static int limit = 2;
public static Thread[] clients = new Thread[limit];
public static int current = 0;
public static int port = 25565;
public static String[] connected = {"", ""};
public static ServerSocket socket;
public static void main(String[] args) {
System.out.println("Server starting...");
try {
ServerSocket socket = new ServerSocket(port);
while(true) {
Socket connection = socket.accept();
String ip = connection.getRemoteSocketAddress().toString().substring(1, 13);
loop:
for(int i = 0; i < connected.length; i++) {
if(connected[0].equals(ip) || connected[1].equals(ip)) {
break loop;
}else if(!connected[i].equals(ip)) {
connected[i] = ip;
System.out.println(ip);
MultiServer_Client client = new MultiServer_Client(connection, i);
Thread run = new Thread(client);
run.start();
break loop;
}
}
}
} catch (IOException e1) {
System.out.println("Could not bind server on: " + port);
System.exit(-1);
}
}
}
这是我的代码处理每个客户端连接:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class MultiServer_Client implements Runnable {
public String time;
public Socket client;
public StringBuffer process = new StringBuffer();
public BufferedInputStream inputStream;
public InputStreamReader reader;
public BufferedOutputStream outputStream;
public OutputStreamWriter writer;
public boolean connected = true;
public int ID;
public MultiServer_Client(Socket connection, int i) {
client = connection;
ID = i;
try {
inputStream = new BufferedInputStream(client.getInputStream());
reader = new InputStreamReader(inputStream);
outputStream = new BufferedOutputStream(client.getOutputStream());
writer = new OutputStreamWriter(outputStream, "US-ASCII");
} catch (IOException e) {
System.out.println("IOException: " + e);
}
System.out.println("Client connected...");
write("Connected to " + MultipleSocketServer.name);
}
public void run() {
while(connected) {
write("hi");
}
System.out.println("Disconnecting client...");
}
public void write(String authen) {
try {
time = new java.util.Date().toString();
String message = time + ": " + authen + (char) 13;
writer.write(message);
writer.flush();
} catch (IOException e) {
connected = false;
MultipleSocketServer.connected[ID] = "";
}
}
public void read() {
//read from client
int character;
process = new StringBuffer();
try {
while ((character = reader.read()) != 13) {
process.append((char) character);
}
System.out.println(process);
process.delete(0, process.length());
} catch (IOException e) {
connected = false;
MultipleSocketServer.connected[ID] = "";
}
}
}
如果我不能帮助Srry.正如我所说,我是套接字的新手,没有其他人似乎对此有任何问题…谢谢:)
解决方法:
您的代码的问题不是它的通信协议的“套接字”.在服务器有机会写出“hi”之前,您正在有效地关闭套接字.
要调试它,您希望降低程序的复杂性.在您的计划中,有许多事情没有任何意义或问题.
所以,关于套接字的一点背景知识.有两种类型的套接字. “ServerSocket”和“Socket”ServerSocket有点像秘书.它唯一的工作是听取呼叫,然后传递它们.这就是“接受”的作用.在任何客户端连接之前,accept()将阻塞,直到它收到连接.客户端连接后,accept返回表示连接的Socket.
常规Socket是所有工作发生的地方.您可以将其视为电话连接.您可以使用OutputStream远程与某人通话,并使用InputStream进行侦听.挑战在于您需要为两个套接字创建某种通信(称为协议)以进行通信.
您需要弄清楚如何划分命令.如果你想要一个“长度”分隔的协议,你可以传递一个固定长度的数字然后传递数据,或者你可以在消息的末尾使用一个特殊的字符(你现在拥有的).对于快速和脏,我经常使用后者与换行符.最简单的方法是使用PrintWriter进行书写,使用Scanner进行阅读.
下一步是找出客户端和服务器的通信模式.想想它是否来回传球.如果客户说了什么,另一方应该是倾听(反之亦然).
一旦找到协议和逻辑,您就可以将用于“处理”服务器端的逻辑移动到单独的线程(称为工作模式)中,以便服务器一次可以处理多个客户端.如果你想更进一步,你可以实现一个带有线程池的反应器,这样服务器就不会用完线程,但这可能是另一天/问题.
我建议遵循套接字上的Java教程:http://docs.oracle.com/javase/tutorial/networking/sockets/index.html
内容总结
以上是互联网集市为您收集整理的Java套接字:我的服务器输入流不会从客户端输出流中读取?全部内容,希望文章能够帮你解决Java套接字:我的服务器输入流不会从客户端输出流中读取?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。