1. 什么是java socket
事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作。Socket就是其中之一,对于Java而言,这些Api存在与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了。
网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数据的通讯就可以了,这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端,基于这个简单的模型,就可以进入网络编程啦。
Java对这个模型的支持有很多种Api,而这里我只想介绍有关Socket的编程接口,对于Java而言已经简化了Socket的编程接口。首先我们来讨论有关提供固定位置的服务方是如何建立的。Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你,ServerSocket server=new ServerSocket(6789);这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。好了,我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持,只要客户方创建一个Socket的实例对象进行支持就可以了。Socket client
=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。
上面的方法基本可以建立一条连线让两台计算机相互交流了,可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的。因为底层的网络是继续数据的,除非远程调用,处理问题的核心在执行上,否则数据的交互还是依赖于IO操作的,所以你也必须导入java.io这个包.java的IO操作也不复杂,它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。
在网络搜索里输入java socket会有N多的结果给你答案。
2. java中的socket是什么意思
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
重要的Socket API:
java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。
. Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
. getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。
. getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。
注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
2ServerSocket类例子编辑
package com.lanber.socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
/**
* 注意:Socket的发送与接收是需要同步进行的,即客户端发送一条信息,服务器必需先接收这条信息,
* 而后才可以向客户端发送信息,否则将会有运行时出错。
* @param args
*/
public static void main(String[] args) {
ServerSocket ss = null;
try {
ss = new ServerSocket(8888);
//服务器接收到客户端的数据后,创建与此客户端对话的Socket
Socket socket = ss.accept();
//用于向客户端发送数据的输出流
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//用于接收客户端发来的数据的输入流
DataInputStream dis = new DataInputStream(socket.getInputStream());
System.out.println("服务器接收到客户端的连接请求:" + dis.readUTF());
//服务器向客户端发送连接成功确认信息
dos.writeUTF("接受连接请求,连接成功!");
//不需要继续使用此连接时,关闭连接
socket.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3客户端的例子编辑
package com.lanber.socket;
importjava.io.DataInputStream;
import java.io.DataOutputStream;
importjava.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientDemo {
/**
* @param args
*/
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost",8888);
//获取输出流,用于客户端向服务器端发送数据
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//获取输入流,用于接收服务器端发送来的数据
DataInputStream dis = new DataInputStream(socket.getInputStream());
//客户端向服务器端发送数据
dos.writeUTF("我是客户端,请求连接!");
//打印出从服务器端接收到的数据
System.out.println(dis.readUTF());
//不需要继续使用此连接时,记得关闭哦
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 求Java Socket大神点拨一个Java Socket API“java.net.SocketException: Connection reset”故障,怎么破
Java Socket编程中,遇到java.net.SocketException: Connection reset异常时,通常会遇到两种情况:一种是客户端或服务器端一端关闭了Socket连接,而另一端仍在发送数据,这会导致发送的第一个数据包被重置;另一种情况是,一端在退出时没有正确关闭连接,而另一端尝试从该连接中读取数据时,也会触发此异常。简单来说,这种异常通常是由于连接断开后的读写操作引起的。
为了更好地理解和解决这个问题,你可以把你的socketClient代码分享一下,让我们一起看看其中可能存在的问题。通常情况下,确保在关闭Socket连接时正确处理流和资源是很重要的。此外,适当增加错误处理逻辑,如检查连接状态并在必要时重新建立连接,也能有效避免此类问题。
另外,如果在处理大量数据或在网络状况不佳的情况下,你也需要考虑使用重试机制或增加超时设置来增强程序的健壮性。
如果你能提供具体的代码片段,我们可以更具体地分析问题所在,并给出针对性的建议。
记得在代码中加入适当的异常处理机制,例如捕获并处理SocketException,并根据具体情况决定是重新建立连接还是终止当前操作。
希望以上信息对你有所帮助。如果有其他相关问题或需要进一步的帮助,请随时提问。
4. java的socket与c#的socket可以相互连接通讯吗
可以实现C#与Java的Socket相互连接通讯。这是因为C#和Java的Socket类都基于TCP/IP协议栈进行封装。在实际应用中,无论是C#还是Java,它们的Socket类都提供了类似的功能,包括创建Socket、绑定端口、监听连接、发送和接收数据等。
具体来说,C#使用System.Net.Sockets命名空间中的Socket类,而Java则使用java.net包下的Socket类。尽管它们的语法和方法名有所不同,但底层的网络通信机制是相同的。因此,只要遵循相同的TCP/IP协议,无论是C#还是Java编写的程序,都可以实现彼此之间的通信。
例如,可以使用C#编写一个服务器端程序,监听特定端口,等待来自Java客户端的连接请求。同样地,Java客户端也可以通过Socket对象连接到这个服务器端,发送和接收数据。反之亦然,Java服务器端可以接受来自C#客户端的连接请求,进行数据交换。
需要注意的是,为了确保通信的顺利进行,双方需要明确使用的网络协议、端口号以及数据传输格式等细节。此外,还需要考虑网络环境的稳定性以及数据的安全传输等问题。
总之,C#与Java的Socket类可以实现相互连接通讯,只要双方遵循相同的网络协议,并正确配置相关参数。这为跨语言的网络通信提供了便利。
5. java中的socket客户端的端口如何绑定
java中的socket客户端只需用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象就可以了,客户端的代码可以看下实例:
Socket socket = new Socket("168.160.12.42",9998);
或:
Socket socket = new Socket(InetAddress.getLocalHost(),5678); // 向主机名为InetAddress.getLocalHost()的服务器申请连接
客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
以上的程序代码建立了一个Socket对象,这个对象连接到ip地址为168.160.12.42的主机上、端口为9998的服务器对象。并且建立了输入流和输出流,分别对应服务器的输出和客户端的写入。
6. JAVA Socket编程和C++Socket编程有什么不同
Socket
是winsock里的原始套接字开发接口API,c++/java
他们是开发语言,而
socket
是一种通讯标准简称。
首先,2者提供的接口不同(主要是封装形式不同),java
本身不带socket通讯底层实现的,而是通过调用系统底层的winsock
API
进行的二次封装,而c/c++
的socket可以理解为
更接近
系统层面的winsock,所以c/c++
的socket
可以提供
更多的底层扩展与控制。
其次,从语言上讲,用JAVA发开出来的socket程序
可以在任何支持JAVA虚拟机上运行,不用修改任何代码。而
C/c++
要根据系统特性进行适当的修改。