导航:首页 > IDC知识 > java服务器端socket

java服务器端socket

发布时间:2020-12-11 22:34:47

1、java中用socket实现客户端与服务端双向连接问题

//服务端程序:
import java.io.*;
import java.net.*;

public class TCPServer {
public static void main(String[] args) throws IOException {
 TCPServer().init();
}
@SuppressWarnings("static-access")
private void init() throws IOException{
@SuppressWarnings("resource")
ServerSocket server = new ServerSocket(1000);
Socket client = null;
while(true){
try {
client = server.accept();
BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
byte[] b = new byte[1024];
int len = 0;
String message = "";
while((len=bis.read(b))!=-1){
message = new String(b,0,len);
System.out.print("客户端:"+client.getInetAddress().getLocalHost().getHostAddress()+"发来消息:" + message);
if("byte".equals(message.trim()))
client.close();
PrintWriter pw = new PrintWriter(client.getOutputStream(),true);
pw.println(message);
}
} catch (Exception e) {
System.err.println("客户端:"+client.getInetAddress().getLocalHost().getHostAddress()+" 已断开连接!");
}
}
}
}//客户端程序:
import java.io.*;
import java.net.Socket;

public class TCPClient implements Runnable{
public static void main(String[] args) throws IOException {
new TCPClient().init();
}
private void init() throws IOException{
@SuppressWarnings("resource")
final Socket client = new Socket("127.0.0.1",1000);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String send = "";
while(true){
send = in.readLine();
PrintWriter out = new PrintWriter(client.getOutputStream(),true);
if(!"byte".equals(send.trim()))
out.println(send);
else{
out.println(send);
System.exit(0);
}
new Thread(new TCPClient(){
@SuppressWarnings("static-access")
public void run(){
try {
BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
byte[] b = new byte[1024];
int len = 0;
while((len=bis.read(b))!=-1){
System.out.println("服务器:" +client.getInetAddress().getLocalHost().getHostAddress()+"发来消息:"+new String(b,0,len).trim());
}
} catch (IOException e) {
System.err.println("连接服务器失败!");
}
}
}).start();
}
}
public void run() {}
}

//服务器测试结果:

客户端:192.168.0.200发来消息:001 byte

客户端:192.168.0.200发来消息:byte

客户端:192.168.0.200 已断开连接!

客户端:192.168.0.200发来消息:adasd

客户端:192.168.0.200 已断开连接!

//客户端测试结果:

---001号客户端--

001 byte

服务器:192.168.0.200发来消息:001 byte

byte //001礼貌说跟服务器说byte

---002号客户端--

adasd //002客户端直接关闭程序

服务器:192.168.0.200发来消息:adasd

2、java的服务器端socket的accept()方法返回值为什么是客户端的socket类型

其实复不管是服务器制还是客户端都是使用的socket,接通之后服务器会产生针对这个客户端的一个socket,当有多个客户端连接上去了,他们互不干扰,是同类型不同的对象。服务器和客户端主要的区别就在这,客户端是一个Socket,服务器却可以有很多个。每次当有新的客户端连接是,服务器会生成一个新的socket来响应,但是我不清楚Java中的服务器是否自带多线程,如果不自带的话,想要程序并发的同时处理响应多个客户端的连接,注意在获取到Socket之后交给线程处理。

3、java 如何在服务器端用socket创建一个监听端口,并对接受的数据进行处理,端口号为3333,请高手指点一下

我百度HI你好了

public class Test {

public static void main(String[] args) {
Test1 t=new Test1();
t.start(); //启动线程
}

}
/**
* 继承一个线程类
* @author Administrator
*
*/
class Test1 extends Thread{
private ServerSocket server = null;
public Test1(){
try {
server=new ServerSocket(3333);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("服务端初始化失败!");
}
}
/**
* 继承父类方法
*/
public void run(){
Socket clientSocket = null;
DataInputStream dis =null;
DataOutputStream dos=null;
String str="";
while(true){
try {
clientSocket=server.accept();
dis = new DataInputStream(clientSocket.getInputStream());//获取输入流,用于接收客户端发送来的数据
dos = new DataOutputStream(clientSocket.getOutputStream());//获取输出流,用于客户端向服务器端发送数据
str=dis.readUTF(); //这里是客户端发送来的数据
/*
* 这里边你就可以做你想操作的事情了
*/
dos.writeUTF("这里是返回到客户端的数据");//这里用来向客户端返回数据
dis.close();
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

4、在java中如何用Socket 进行 服务器端和客户端交互的,具体一点。

打横杠是因为那个方法已经过时了现在已经不怎么用了。。。
Socket 服务器: 1先创建 ServerSocket ss = new ServerSocket(端口号)

2 接收请求 Socket s = ss.accept()

3接收消息 先读后写BufferedReader in = new BufferedReader(
new InputStreamReader(s.getInputStream(),"utf-8"));
String str = in.readLine(); PrintWriter out = new PrintWriter
( new BufferedWriter( new OutputStreamWriter(s.getOutputStream())),true);
out.println("服务器信息");

4关闭流out.close();
in.close();
is.close();

客户端 1、通过IP地址和端口实例化Socket,请求连接服务器
2、获取Socket上的流以进行读写。
3、对流包装进BufferedReader/PrintWriters实例
4、关闭打开的流

5、服务器端是用java直接写socket呢?还是用tomcat之类的呢?

不要重复造轮子,除非你写的比tomcat更好。

6、Java中服务器端ServerSocket对象怎么获取服务器端地址和端口号??,怎么获取远程请求的

ServerSocket s = new ServerSocket(8888);
while (true) {
// 建立连接
Socket socket = s.accept();

/ /getInetAddress()获取远程ip地址,getPort()远程客户端的断后好
"你好,客户端地址信息: " + socket.getInetAddress() + "\t客户端通信端口号: " + socket.getPort()

7、编写代码,使用java ServerSocket创建服务器端ServerSocket的过程。

服务器端代码:

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public void server(){
        try {
            ServerSocket serverSocket = new ServerSocket(8888); //建立服务器端的套接字,并监听8888端口

            Socket socket = serverSocket.accept(); //如果有请求到达,则接受请求,并建立一个新的套接字
            InputStream is = socket.getInputStream(); //获取此套接字上的输入流,用于接收消息

            //接下来就是获取套接字里的字节流,并转化为字符串
            byte[] bytes = new byte[1024];
            int count;
            StringBuilder sb = new StringBuilder();
            while((count = is.read(bytes)) != -1){
                sb.append(new String(bytes, 0, count));
            }

            is.close();
            System.out.println(sb.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        Server s = new Server();
        s.server();
    }

}

另附客户端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {
    public void client(){
        try {
            Socket socket = new Socket(); //建立套接字
            socket.connect(new InetSocketAddress("127.0.0.1", 8888)); //连接到指定IP地址的主机,并指定端口号接收消息

            OutputStream os = socket.getOutputStream(); //获取此连接上的输出流,用于发送数据
            os.write(new String("Hello, world!").getBytes()); //将字符串转化为字节数组写入输出流
            os.flush();//刷新此输出流,将字节流写入它们预期的目标
            os.close(); //关闭连接,否则会报连接重置异常
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Client c = new Client();
        c.client();
    }
}

8、java的客户端用的是Socket,服务器端用SocketChannel,这两种能实现通信么? 说得比较白,望理解

Socket 和ServerSocke 是一对 他们是java.net下面实现socket通信的类
SocketChannel 和ServerSocketChannel是一对 他们是java.nio下面实现通信的类 支持版异步通信

服务器必权须先建立ServerSocket或者ServerSocketChannel 来等待客户端的连接
客户端必须建立相对应的Socket或者SocketChannel来与服务器建立连接
服务器接受到客户端的连接受,再生成一个Socket或者SocketChannel与此客户端通信

不过Socket和SocketChannel可以通过 socket.channel() SocketChannel.socket() 方法相互转换
同理ServerSocket 和ServerSocketChannel 也可以相互转换

9、java socket服务器实现

下面是一个简单的通讯的例子,来传输服务器和客户端之间传输文件。 。如果它是一个简单的文本传输内容到文字的话来简化操作了。 。 。

1服务器

包sterning;

进口java.io.BufferedInputStream中;

进口java.io.DataInputStream中; 进口java.io.DataOutputStream中;

进口的java.io.File;

进口java.io.FileInputStream中;

进口java.net.ServerSocket的;

进口的java。 net.Socket;

公共类ServerTest {

整数端口= 8821;

无效启动(){

插座S = NULL;

尝试{

ServerSocket的SS =新的ServerSocket(端口);

而(真){

/ /选择要

字符串文件路径=传输的文件“D:\ \ lib中的RAR”;

文件FI =新的文件(文件路径);

System.out.println(“文件长度:”+(int)的fi.length());

/ /公共套接字accept()方法抛出

/ / IOException异常监听并接受此套接字连接。这种方法已经在连接之前被封锁。

S = ss.accept();

System.out.println(“建立socket连接”);

数据输入流DIS =新的数据输入流(新的缓冲输入流(S.的getInputStream()));

dis.readByte();

数据输入流FIS =新的数据输入流(新的缓冲输入流(新文件输入流(文件路径)));

数据输出流PS =新的数据输出流(s.getOutputStream());

/ /文件名,长度到客户端。要真的在这里适用所有平台,如处理中国的名字,但还需要进行处理,具体想想在Java第四届你可以看到,有现成的代码。

ps.writeUTF(fi.getName());

ps.flush();

ps.writeLong((长)fi.length());

ps.flush();

整型的bufferSize = 8192;

的byte [] buf中=新的字节[的bufferSize];

而(真){

整数读= 0;

如果{

阅读= fis.read(BUF)(FIS = NULL!);

如果(读== -1){

突破;

ps.write(BUF,0,读);

ps.flush();

/ /注意关闭套接字连接哦,否则客户端将等待数据服务器过,

/ /直到套接字超时,导致数据不完整。

fis.close();

S.CLOSE();

System.out.println(“文件传输完毕”);

}赶上(例外五){

e.printStackTrace();

公共静态无效的主要(字串ARG []){

新ServerTest()开始();。的使用率辅助类

包sterning

}

}

2。底座;

程序import java.net *;。

进口java.io. *;

公共类ClientSocket的{

私有String IP;

私人INT端口;

私人Socket套接字= NULL;

数据输出流出来= NULL;

数据输入流getMessageStream = NULL;

公共ClientSocket的(字符串的ip,诠释端口){

this.ip = IP;

this.port =口;

/ *** / / **

*创建一个socket连接

*

* @抛出异常

*例外 BR /> * /

公共无效创建连接()抛出异常{尝试{

插座=新的Socket(IP,端口);

}赶上(例外五){

e.printStackTrace();!

如果(插座= NULL)

socket.close();

扔é;

} {终于

}

}

公共无效的sendMessage(字符串的sendMessage)抛出异常{

尝试{

出=新的数据输出流( socket.getOutputStream());

如果(sendMessage.equals(“视窗”)){

out.writeByte(0X1);

了out.flush();

返回;

}

如果(sendMessage.equals(“UNIX”)){

out.writeByte(0X2);

了out.flush();

返回;

}

如果(sendMessage.equals(的“Linux”)){

out.writeByte(0x3的);

了out.flush();

}其他{

out.writeUTF(的sendMessage);

了out.flush();

赶上(例外五){

e.printStackTrace();

如果(!出= NULL)

out.close();

扔é;

} {终于

}

}

公开数据输入流getMessageStream()抛出异常{

{

getMessageStream =新的数据输入流(新缓冲输入的尝试(socket.getInputStream()));

返回getMessageStream;

}赶上(例外五){

e.printStackTrace();!

如果(getMessageStream = NULL)

getMessageStream.close();

扔é;

} {终于

}

}

公共无效shutDownConnection(){

尝试{

如果(!出= NULL) out.close();

getMessageStream.close()(getMessageStream =空!);

如果(插座= NULL!)

socket.close();。

}赶上(例外五){

3客户端

包sterning ;

进口java.io.BufferedOutputStream;

进口java.io.DataInputStream中;

进口java.io.DataOutputStream中;

进口java.io.FileOutputStream中;

公共类ClientTest {

私人ClientSocket的CS = NULL;

私人字符串的ip =“本地主机”;/ /设置服务器IP

私人INT端口= 8821;

私人字符串的sendMessage =“Windwos下”;

公共ClientTest(){

{

尝试,如果(创建连接()){

的sendMessage();

的getMessage();

}赶上(例外){

ex.printStackTrace();

私人布尔创建连接(){

CS =新ClientSocket的(IP,端口); 尝试{

cs.CreateConnection();

System.out.print(“连接服务器成功!”+“\ n”);

返回true;

}赶上(例外五){

System.out.print(“!无法连接到服务器”+“\ n”);

返回false;

私人无效的sendMessage(){

如果(CS == NULL)

回报;

尝试{

cs.sendMessage(的sendMessage);

}赶上(例外五){

System.out.print(“!发送消息失败”+“\ n”);

私人无效的getMessage(){

如果(CS == NULL)

回报;

数据输入流的InputStream = NULL;

尝试{

的InputStream = cs.getMessageStream();

}赶上(例外五){

System.out.print(“接收消息缓冲区错误\ n”);

返回;

{

/ /本地保存路径}

试试,文件名会自动从服务器继承。

字符串SAVEPATH =“E:\ \”;

整型的bufferSize = 8192;

的byte [] buf中=新的字节[的bufferSize];

整数passedlen = 0; 长LEN = 0;

SAVEPATH + = inputStream.readUTF();

数据输出流fileOut =新的数据输出流(新的缓冲输出流(newBufferedOutputStream(新文件输出流(SAVEPATH)))); LEN = inputStream.readLong();

System.out.println(“文件的长度是:”+ LEN +“\ n”);

系统。通过out.println(“开始接收文件!”+“\ n”);

而(真){

整数读= 0;

如果(inputStream! = NULL){

阅读= inputStream.read(BUF);

passedlen + =读;

如果(读== -1){

突破;

/ /进度条,如果它要播放的文件,你可以重复打印出一些相同的百分比

System.out.println的( “收到的文件”+(passedlen * 100 / LEN)+“%\ N”);

fileOut.write(BUF,0,读);

System.out的。的println(“接收完成,将文件保存为”+ SAVEPATH +“\ n”);

fileOut.close();

}抓(例外五){

System.out.println(“收到错误消息”+“\ n”);

返回;

公共静态无效的主要(字串ARG []){
新ClientTest();

10、java编程实现客户端和服务器端使用socket进行通讯的程序

Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器那么多个客户端如何实现呢?
其实,简单的分析一下,就可以看出客户和服务通讯

与java服务器端socket相关的知识