我正在开发一个简单的客户端/服务器应用程序,它使用套接字进行所有通信.通信是基于数据包的,数据包的概念是使用一组类和ObjectInputStream/或ObjectOutputStream套接字流的包装器实现的.
想知道这种方法与基于全文本的协议(如IRC)或"非常二进制"的东西(我明确使用字节)相比是否有任何缺点.
让我们忽略这里的流量问题("qwerty"与"qwerty"+ 1KB的元数据)并且只考虑可靠性和可维护性.
你怎么看?
问题"如何逐行读取本地(res/raw)文件?" 处理类似的问题,但我无法根据那里提供的答案构建解决方案.我确实得到了一个非常有用的信息(DataInputStream类有一个readLine方法),我一直在开发人员网站上研究这个并尝试使它工作.
我想要做的是将存储在文本文件的连续行中的信息读取到字符串数组中,这样第一行是第一个数组元素,第二行是下一个数组元素等等......然后这个字符串array将用于填充下一个打开的活动中的文本字段.这一切都发生在一个开关盒内(取决于案例,即选择了哪个列表项,加载了不同的文本文件).这是我到目前为止:
//Retrieve necessary text file for inputstream
InputStream buildinginfo = getResources().openRawResource(R.raw.testbuilding);
class DataInputStream extends FilterInputStream{
protected DataInputStream(InputStream buildinginfo) {
super(buildinginfo);
// TODO Auto-generated constructor stub
int i;
String[] building_info;
//Assign lines of text to array
for(i=0; i<5; i++){
building_info[i] = buildinginfo.readLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,除了这些错误之外,编辑器还可以使用它,而且我没有足够的经验来理解它们.我理解他们在说什么但不知道如何解决它们.错误位于交换机案例内部,我正在尝试设置输入流并分配值.最重要的是,在readLine命令发生的行中,我得到:" - 对于类型DataInputStream,方法readLine是未定义的" - 对于InputStream类型,方法readLine是未定义的"
这个我不明白,因为如果我没有弄错,它在这里说(http://developer.android.com/reference/java/io/DataInputStream.html),DataInputStream类有readLine方法可用(我发现了一下这来自上面提到的问题).显然我没有正确使用DataInputStream,但我似乎无法弄清楚如何.我在这里查看了几个问题,并多次提到上面链接的页面.
如果有人能看出我做错了什么,我会非常感谢你的帮助.如果我为这类任务完全咆哮错误的树,我为浪费时间而道歉,但是一些指南或推荐给适当的教程资源将非常感激.我花了最近两天试图找出这些错误.
我目前有一个有效的解析器.它解析一次文件(不是我想要它做的),然后将解析后的数据输出到文件中.我需要它继续解析并附加到相同的输出文件,直到输入文件的末尾.看起来像这样.
try {
// my code parsing the data and appending to eof of output. (works)
}
catch (EOFException eof){
}
Run Code Online (Sandbox Code Playgroud)
除了while循环外,一切都已完成.它只在我需要时解析一次才能继续解析.我正在寻找一个while循环函数来达到eof.
我也在使用DataInputStream.是否有某种DataInputStream.hasNext函数?
DataInputStream dis = new DataInputStream(new FileInputStream(inFile));
i.e. dis.read();
Run Code Online (Sandbox Code Playgroud)
.
//Need a while !eof while loop
try {
// my code parsing the data and appending to eof of output. (works)
}
catch (EOFException eof){
}
Run Code Online (Sandbox Code Playgroud) 我正在使用对称密钥+ RSA开发FTP工具.我想通过dataoutputstream将我的密钥发送到服务器.我可以这样做吗?我试过跟着,
客户:
SecretKey secretKey = en_de_cryptor.returnSecretKey();
String encodedKey = Base64.encode(secretKey.getEncoded());
dout.writeUTF(secretKey.toString());
Run Code Online (Sandbox Code Playgroud)
服务器:
String secretKey = din.readUTF();
byte[] decodedKey = Base64.decode(secretKey);
Run Code Online (Sandbox Code Playgroud)
但我无法获得解码密钥.我该如何解决这个问题,并在服务器端获取密钥.
java dataoutputstream secret-key datainputstream javax.crypto
我编写了一个简单的服务器来监听客户端,当客户端连接时,它打开一个Datainputstream,读取客户端发送的所有数据(我的客户端的UTF数据).
这是ServerCode:
@Override
public void run() {
// TODO Auto-generated method stub
try {
ServerSocket ss = new ServerSocket(7000);
while(true){
System.out.println("Il Server sta cercando Connessioni");
Socket s = ss.accept();
System.out.println("Il Server ha accettato un Client");
Thread t2 = new Thread(new Runnable(){
public void run(){
try {
while(true){
DataInputStream dis = new DataInputStream(s.getInputStream());
isAlreadyOpened = true;
System.out.println(dis.readUTF());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
isAlreadyOpened = false;
}
}
});
if(!isAlreadyOpened){
t2.start();
}
}
} catch …Run Code Online (Sandbox Code Playgroud) 我是Java初学者,试图让它在Eclipse中运行.但是,它readLine已被删除并且通知说它已被弃用.代码工作,虽然不是while ((var2 = var5.readLine()) != null) { 一点......所以我想知道如何解决它.
final class ScreenShotHelper$1 implements Runnable
{
public void run()
{
try
{
String var1 = ScreenShotHelper.access$000().getAbsolutePath();
String var2 = "";
HttpURLConnection var3 = null;
DataOutputStream var4 = null;
DataInputStream var5 = null;
String var6 = "\r\n";
String var7 = "--";
String var8 = "*****";
String var9 = "";
int var10 = 1048576;
String var11 = "";
var9 = Minecraft.getMinecraft().thePlayer.username;
String var12 = "http://localhost/screenupload/index.php?playername=" + var9;
try
{
FileInputStream var13 …Run Code Online (Sandbox Code Playgroud) 背景:我有一个任务,我将通过套接字传递信息到非常有限的程度.它可以是每个消息最多10个字节,我以为我只发送一个字节(因为一个字节足以在协议中发出256个不同的状态).现在我开始四处寻找有关这方面的信息,我遇到了很多问题.如果可以的话,请纠正我的假设错误并回答我的字面问题.
所以有原始数据类型字节(基本上是介于-128和127之间的数字,对吧?).如果我使用
byte b = 125;
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)
...我得到正确的数字打印到控制台,如果我尝试分配超出限制的值,编译器会抱怨.
然后我们有类Byte,它显然是从字节数据类型(或API中的int)创建一个Byte对象:
Byte b = new Byte(20);
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)
这也产生了预期的结果,并且20被打印到控制台,如果我尝试使用高于127的数字,编译器会抱怨.
1.数据类型字节和类字节有什么区别?是否主要是因为类提供了许多方法,如类Integer为类型int做的?
下一个片段会产生奇怪的结果(对我而言):
import java.io.*;
public class ByteTest {
public static void main(String[] args) {
DataInputStream in = new DataInputStream(System.in);
try {
byte d;
while((d = in.readByte()) != 0) {
System.out.println(d);
}
}
catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
}
Run Code Online (Sandbox Code Playgroud)
2.输入被读取和输出将输入解释为十进制形式的ASCII字符(例如,1返回49),接着是另外两行,数字为13和10.这是为什么?
(如果我将d声明为字节或字节无关紧要,结果是相同的,我已经混合了从字节b获取值,依此类推,但这三行(或更多)始终是结果而我想要的只是输入回到我身边)
基本上我对此有点困惑,但最后,我想要的只是发送这些单个字节的合理方式,当我发送34时,我希望对方收到34,没有别的.
3.假设我没有使用类Byte,只想在流上发送一个类型字节.所有常规流和读取器似乎都只读取一个int(我假设它们会阻塞,直到它们至少有两个字节的输入,因为我只发送一个).我是否被迫使用DataInputStream并且 DataOutputStream我必须在对象字节中包装类型字节或者还有其他方法吗?
所有这一切让我怀疑我是否可以相信一个对象Byte真的只是一个字节的数据而已......我很困惑:(
提前致谢!
我现在正在服务器上玩游戏.服务器的数据包读取循环是阻塞的,并且通常等待直到收到数据包才能继续循环.但是,如果客户端断开连接,DataInputStream将返回单个字节(-1),并且如预期的那样快速连续执行循环.但是,我不使用DataInputStream的read()方法一次读取一个字节,我使用read(byte [])方法将它们一次性读取到一个字节数组中.因此,我无法轻易检测到流是否返回值为-1的单个字节.
可能的解决方案:我可以检查数组的第一个字节是否为-1,如果是,则循环遍历数组以查看数组的其余部分是否为零.这样做看起来效率极低,我觉得随着客户端数量的增加会影响性能.
这是我的数据包读取循环的简化版本:
while (!thread.isInterrupted() && !isDisconnected())
{
try
{
byte[] data = new byte[26];
data = new byte[26];
input.read(data);
//Need to check if end of stream here somehow
Packet rawPacket = Packet.extractPacketFromData(data); //Constructs packet from the received data
if(rawPacket instanceof SomePacket)
{
//Do stuff with packet
}
}
catch(IOException e)
{
disconnectClient(); //Toggles flag showing client has disconnected
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试读取byte[]从客户端发送到服务器的内容。
这是我的客户端代码...
din = new DataInputStream(socket.getInputStream());
dout = new DataOutputStream(socket.getOutputStream());
Cipher cipher = Cipher.getInstance("RSA");
// encrypt the aeskey using the public key
cipher.init(Cipher.ENCRYPT_MODE, pk);
byte[] cipherText = cipher.doFinal(aesKey.getEncoded());
dout.write(cipherText);
Run Code Online (Sandbox Code Playgroud)
这是我的服务器代码...
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
String chiper = dis.readUTF();
System.out.println(chiper);
Run Code Online (Sandbox Code Playgroud)
但是,该dis.readUTF();行失败但有异常...
java.io.EOFException at java.io.DataInputStream.readFully(DataInputStream.java:197)
at java.io.DataInputStream.readUTF(DataInputStream.java:609)
at java.io.DataInputStream.readUTF(DataInputStream.java:564)
at gameserver.ClientHandler.run(GameServer.java:65)
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我理解为什么这不起作用。
从PC(服务器端),C#.Net应用程序必须通过Wi-Fi向Android设备(客户端)发送22000字节的数据.但dataInputStream在Android设备中只显示了2048个字节.
dataInputStream = new DataInputStream(workerSocket.getInputStream());
byte[] rvdMsgByte = new byte[dataInputStream.available()];
for (int i = 0; i < rvdMsgByte.length; i++)
rvdMsgByte[i] = dataInputStream.readByte();
String rvdMsgStr = new String(rvdMsgByte);
Run Code Online (Sandbox Code Playgroud)
我对以下内容感到困惑:
或者,dataInputStream即使设备收到所有字节后,是否只显示2048字节?
如果(data_received <= 2048字节)上面的代码工作正常;
我制作了自己的缓冲式打字机.但我不知道它是否确实如此?
当我退出时,我做了一个缓冲读取器(200个硬币),当我登录时,我得到(545453个硬币)或其他金额,我确信它是缓冲区的,请帮助!
public static int coins;
private static final String DIR = "./Data/";
public static boolean SavePlayer;
public static void saveAll() {
SavePlayer = true;
if (!SavePlayer) {
System.out.println("[WoG Error]: Their was an error saving players.");
return;
}
saveGame();
}
public static boolean saveGame() {
if (Player.playerName == null) {
return false;
}
try {
File file = new File(DIR + Player.playerName.toLowerCase() + ".dat");
if (!file.exists())
file.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(file);
DataOutputStream o = new DataOutputStream(fileOutputStream);
o.writeUTF(Player.playerName);
o.writeInt(Player.coins);
//o.writeInt(Player.height); …Run Code Online (Sandbox Code Playgroud) datainputstream ×11
java ×10
android ×2
arrays ×2
.net ×1
byte ×1
c# ×1
eof ×1
eofexception ×1
java-io ×1
javax.crypto ×1
networking ×1
packet ×1
readline ×1
secret-key ×1
sockets ×1
while-loop ×1