Java中的套接字和对象是一个非常基本的示例
我试图在一台服务器和一台客户机之间创建一个简单的传输。我正在尝试将对象从客户端发送到服务器。我已经检查我的代码很多次了,真的不知道为什么t不工作。另外,我想补充一点,我在netbeans中创建了两个独立的项目,一个用于客户端,一个用于服务器。代码如下: 客户:Java中的套接字和对象是一个非常基本的示例,java,sockets,object,Java,Sockets,Object,我试图在一台服务器和一台客户机之间创建一个简单的传输。我正在尝试将对象从客户端发送到服务器。我已经检查我的代码很多次了,真的不知道为什么t不工作。另外,我想补充一点,我在netbeans中创建了两个独立的项目,一个用于客户端,一个用于服务器。代码如下: 客户: package client; import java.net.*; import java.io.*; import java.util.Scanner; import java.io.Serializable; class Obje
package client;
import java.net.*;
import java.io.*;
import java.util.Scanner;
import java.io.Serializable;
class Object implements Serializable {
String one;
String two;
public Object(String one, String two){
this.one = one;
this.two = two;
}
@Override
public String toString(){
return "\nOne: " + one +"\nTwo: " + two;
}
}
public class Client {
public static void main(String[] args){
try {
Object obj= new Object ("Something", "Else");
Socket sock = new Socket("127.0.0.1", 1111);
ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());
System.out.println("Connecting to "+ sock.getInetAddress()+ " and port "+sock.getPort());
System.out.println("Local Address :"+sock.getLocalAddress()+" Port:"+sock.getLocalPort());
oos.writeObject(obj);
oos.flush();
oos.close();
sock.close();
System.out.println("Connection Closing...");
} catch (Exception ex){
System.out.println("No Conenction");
}
}
}
服务器:
<!-- language: lang-java -->
package server;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.*;
import java.io.*;
class Object implements Serializable {
String one;
String two;
public Object(String one, String two){
this.one = one;
this.two = two;
}
@Override
public String toString(){
return "\nOne: " + one +"\nTwo: " + two;
}
}
public class Server {
public static void main(String[] args){
try{
ServerSocket server = new ServerSocket(1111,10);
System.out.println("Waiting Incoming Connection...");
System.out.println("Local Address :"+server.getInetAddress()+" Port:"+server.getLocalPort());
Socket sock = server.accept();
ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
Object ob=new Object ("Once", "Upon"); //for test
Object obj2= null;
try{
obj2 = (Object )ois.readObject();
System.out.println(obj2);
}catch (Exception ex){
System.out.println("nothing...");
}
System.out.println(ob);
ois.close();
}catch (Exception ex){
System.out.println("Error during I/O");
ex.getMessage();
ex.printStackTrace();
}
}
}
包服务器;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
导入java.io.Serializable;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.net。*;
导入java.io.*;
类对象实现可序列化的{
第一串;
弦二;
公共对象(字符串1、字符串2){
这个1=1;
这个2=2;
}
@凌驾
公共字符串toString(){
返回“\nOne:+one+”\nTwo:+two;
}
}
公共类服务器{
公共静态void main(字符串[]args){
试一试{
ServerSocket服务器=新的ServerSocket(1111,10);
System.out.println(“等待传入连接…”);
System.out.println(“本地地址:+server.getInetAddress()+”端口:+server.getLocalPort());
Socket sock=server.accept();
ObjectInputStream ois=新的ObjectInputStream(sock.getInputStream());
Object ob=新对象(“一次”、“一次”);//用于测试
对象obj2=null;
试一试{
obj2=(Object)ois.readObject();
系统输出打印项次(obj2);
}捕获(例外情况除外){
System.out.println(“无…”);
}
系统输出打印项次(ob);
ois.close();
}捕获(例外情况除外){
System.out.println(“I/O期间的错误”);
例如getMessage();
例如printStackTrace();
}
}
}
代码可以工作,但从未发送对象=/。我得到的信息是“没什么…”这是例外。该连接之所以有效,是因为它们与简单消息BufferedReader()、BufferedWriter()交换消息。问题在于对象…1)不要只说“抛出了一些异常”。打印引发哪个异常以及在哪里(e.printStackTrace()
)
2) 很可能,您必须在服务器和客户端中使用相同的类。这意味着相同的包(client.Object
)也不同于(server.Object
)。可能您得到了一个ClassCastException
)
3) 请不要使用API中的类名命名类,而不要使用java.lang
中的类名任何名称都优于对象
更新:一些实现技巧
又快又脏。将server.Object
重命名为server.MyServer
。导入client.Object
。将obj2
变量设为client.Object
。问题在于,要运行服务器,需要在类路径中包含客户端代码
更详细。使用要传输的对象的定义创建第三个类(比如mytest.Bean
)。在客户端和服务器代码中都使用此类类(不要忘记将其添加到类路径)
最后,当您拥有一个真正的应用程序时,您将使共享数据成为一个库,并在服务器和客户端应用程序中导入它。1)不要只说“引发了一些异常”。打印引发哪个异常以及在哪里(e.printStackTrace()
)
2) 很可能,您必须在服务器和客户端中使用相同的类。这意味着相同的包(client.Object
)也不同于(server.Object
)。可能您得到了一个ClassCastException
)
3) 请不要使用API中的类名命名类,而不要使用java.lang
中的类名任何名称都优于对象
更新:一些实现技巧
又快又脏。将server.Object
重命名为server.MyServer
。导入client.Object
。将obj2
变量设为client.Object
。问题在于,要运行服务器,需要在类路径中包含客户端代码
更详细。使用要传输的对象的定义创建第三个类(比如mytest.Bean
)。在客户端和服务器代码中都使用此类类(不要忘记将其添加到类路径)
最后,当您拥有一个真正的应用程序时,您将使共享数据成为一个库,并在服务器和客户端应用程序中导入它。与其为每个类创建一个项目,不如将所有类都放在同一个项目中 事实上,最简单的方法可能是使用一个类。将
对象
类重命名为更有意义的类(如何MyNetworkType
?)MyNetworkType
应该有一个main
方法,该方法接受“client”或“server”作为命令行参数。如果获得“client”,请运行一个client
方法,该方法包含给定的client.main()
中的代码。如果获得“server”,请运行一个方法,该方法包含给定的server.main()
中的代码
你的班级最终会变成这样:
class MyNetworkType implements Serializable {
//
// Data here
//
public MyNetworkType() {
// initialize your data
}
public static void runClient() {
// Copy the code from Client.main() here
}
public static void runServer() {
// Copy the code from Server.main() here
}
public static void main(String[] args) {
if( args[0].equals("client") ) {
MyNetworkType.runClient();
}
else if( args[0].equals("server") ){
MyNetworkType.runServer();
}
}
}
我知道如何在eclipse中传递命令行参数(当然也在命令行上),但要用NetBeans来解决这个问题,就得靠自己了
请注意,这不是一个好的设计。实际上,您肯定希望客户机和服务器在不同的类中(但不一定需要将它们放在不同的项目中)。但是您正在寻找一个非常基本的示例,还有什么比单个类更简单呢
我希望这会有所帮助。与其为每个类创建一个项目,不如将所有类放在同一个项目中 事实上