Ⅰ socket 线程 思路 java
网上参考别人的例子 改自己的程序 终于搞明白了 原来在socket的服务器端设置线程并不是像之前想的那样 建立一个连接后就重新开一个端口去监听 这样的想法遇到了很多问题 首先 当我把客户端 弄成for循指谈谈环递增的链接个格端口的时候 发现总是异常 因为服务器端的新的端口建立速度总是没有客户端的主动连接块 然后试图去让客户端创建新端口链接的速度降慢 但是一直没调试成功 并且即便是成功了 这个问侍纯题还是有隐患的 因为客户端的链接速度是不可控的 有两天 这个问题没有进展 后来在网上查到了 原来服务器端的线程 并不是用来创建新的端口的 之前也想过 一个服务器端不可能就连接一个客户端 但是没想出来解决办法 看了例子的提示后 才做出来 服务器端的线程是用来监听连接客户端的 即 当监听到客户端的连接请求时就会主动去创建一个socket线程去连接 完成客户端和服务器端的交互 后客户端自动断开链接
核心代码
Main 函数
ServerSocket serverSocket=null
boolean listening=true
try{
serverSocket=new ServerSocket( )
//创建一个ServerSocket在端口 监听客户请求
}catch(IOException e) {}
while(listening){ //永远循环监听
newServerThread(serverSocket accept() clientnum) start()
//监听到客户请求 根据得到的Socket对象和
客户计数创建服务线程 并启动之
clientnum++ //增加客户计数
}
serverSocket close() //关闭ServerSocket
设唯碰计ServerThread类
public class ServerThread extends Thread{
Socket socket=null //保存与本线程相关的Socket对象
int clientnum //保存本进程的客户计数
public ServerThread(Socket socket int num) { //构造函数
this socket=socket //初始化socket变量
clientnum=num+ //初始化clientnum变量
}
public void run() { //线程主体
try{//在这里实现数据的接受和发送
lishixin/Article/program/Java/hx/201311/26230
Ⅱ java socket如何实现客户端与客户端的交互
问题一:客复户端接收可以采制用下列步骤:
1、无论客户端还是服务器都要有能力构造实体bean(比如叫做userbean,存放用户信息),构造userlist封装userbean数组。并且,上述类要支持序列化和反序列化。
2、服务端将list
userlist序列化,然后利用serversocket发送。
3、客户端利用socket接收,对userlist反序列化,遍历userbean数组得到每一个用户的信息。
问题二:对于socket,不存在得到还是得不到的——
你要利用tcp、udp协议先要构造和初始化socket才行。
客户端socket和服务端socket进行全双工通信。
即使是最简单im演示程序,用户的好友列表都应该考虑在服务器端持久化和管理。
客户端程序要想得到其好友列表,只需要执行一次”请求/响应”即可。写这方面的程序,可以参考xmpp相关技术。
Ⅲ java中如何创建socket连接的过程
1、在打开的ie浏览器窗口右上方点击齿轮图标袜型,选择“Internet选项”,如下图所示:
Ⅳ java中如何创建socket连接的过程
//创建Socket 客户端对象
Socket s = new Socket("127.0.0.1",6666);
//创建ServerSocket 服务器端对象。专。
ServerSocket ss = new ServerSocket(6666);
//监听服务器连属接
s = ss.accept();
Ⅳ java编程中,Socket通信是怎么实现的
java编程对于Socket之间的通信过程如下:
服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。下面来看一些服务端与客户端通信的例子:
publicclassServer{
publicstaticvoidmain(Stringargs[])throwsIOException{
//为了简单起见,所有的异常信息都往外抛
intport=8899;
//定义一个ServerSocket监听在端口8899上
ServerSocketserver=newServerSocket(port);
//server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}
}
客户端代码
Java代码publicclassClient{
publicstaticvoidmain(Stringargs[])throwsException{
//为了简单起见,所有的异常都直接往外抛
Stringhost="127.0.0.1";//要连接的服务端IP地址
intport=8899;//要连接的服务端对应的监听端口
//与服务端建立连接
Socketclient=newSocket(host,port);
//建立连接后就可以往服务端写数据了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//写完后要记得flush
writer.close();
client.close();
}
}
Ⅵ 请问Socket编程的基本步骤是怎样的最好能写一个简单的程序Java演示一下,主要是接受数据。谢谢!
SERVER端:
--------------------------------------------------------
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
{
privateSocketclientSocket;
publicServer(SocketclientSocket){
this.clientSocket=clientSocket;
}
publicvoidrun(){
DataInputStreamdis=null;
DataOutputStreamdos=null;
try{
dis=newDataInputStream(clientSocket.getInputStream());
dos=newDataOutputStream(clientSocket.getOutputStream());
while(true){
Stringtemp=dis.readUTF();
if("over".equals(temp)){
break;
}
dos.writeUTF("fromserver:"+temp);
}
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
if(dis!=null){
dis.close();
}
if(dis!=null){
dos.close();
}
if(clientSocket!=null){
clientSocket.close();
}
}catch(IOExceptione){
}
}
}
publicstaticvoidmain(String[]args)throwsException{
ServerSocketss=newServerSocket(8008);
while(true){
SocketclientSocket=ss.accept();
//针对每个客户端,启一个Server线程专门处理此客户端的请求。
Serverserver=newServer(clientSocket);
server.start();
}
}
}
CLIENT端:
----------------------------------------
importjava.io.BufferedReader;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.InputStreamReader;
importjava.net.Socket;
publicclassClient{
publicstaticvoidmain(String[]args)throwsException{
//输入流1,从键盘进入Client。
InputStreamReaderisr=newInputStreamReader(System.in);
BufferedReaderbr=newBufferedReader(isr);
SocketclientSocket=newSocket("127.0.0.1",8008);
//输入流2,从服务器端进入Client的流对象。
DataInputStreamdis=newDataInputStream(clientSocket.getInputStream());
//输出流,从Client出去,到服务器端。
DataOutputStreamdos=newDataOutputStream(clientSocket.getOutputStream());
while(true){
//从键盘输入读取
Stringmsg=br.readLine();
//将读取信息发送给服务器端
dos.writeUTF(msg);
//输入QUIT退出
if("QUIT".equals(msg)){
break;
}
//读取从服务器返回的信息
Stringtemp=dis.readUTF();
System.out.println(temp);
}
br.close();
dis.close();
dos.close();
clientSocket.close();
}
}
Ⅶ 用JAVA编写一个socket通信程序。
端口监听和建立管道。首先服务器端绑定监听端口,然后客户端socket连接到这个端口,控制台输入的字符串都会被在这个端口监听的服务器接收到。
Ⅷ Java Socket初步详解
网络编程的基本模型就是客户机到服务器模型 简单的说就是两个进程之间相互通讯 然后其中一个必须提供一个固定的位置 而另一个则只需要知道这个固定的位置 并去建立两者之间的联系 然后完成数据的通讯就可以了 这里提供亩悉猜固定位置的通常称为服务器 而建立联系的通常叫做客户端 基于这个简单的模型 就可以进入网络编程啦
Java对这个模型的支持有很多种Api 而这里我只想介绍有关Socket的编程接口 对于Java而言已经简化了Socket的编程接口 首先我们来讨论有关提供固定位置的服务方是如何建立的 Java提供了ServerSocket来对其进行支持 事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你 ServerSocket server=new ServerSocket( );这里稍微要注意的是端口的分配必须是唯一的 因为端口是为了唯一标识每台计算机唯一服务的 另外端口号是从 ~ 之间的 前 个端口已经被Tcp/Ip 作为保留端口 因此你所分配的端口只能是 个之后的 好了 我们有了固定位置 现在所需要的就是一根连接线了 该连接线由客户方首先提出要求 因此Java同样提供了一个Socket对象来对其进行支持 只要客户方创建一个Socket的实例对象进行支持就可以了 Socket client
=new Socket(InetAddress getLocalHost() );客户机必须知道有关服务器的IP地址 对于著一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供 它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法
上面的方法基本可以建立一条连线让两台计算机相互交流了 可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的 因为底层的网络是继续数据的 除非远程调用 处理问题的核心在执行上 否则数据的陆帆交互还是依赖于IO操作的 所以你也必须导入java io这个包 java的IO操作也不复杂 它提供了针对于字节流和Unicode的读者和写者 然后也提供了一个缓冲用于数据的读写
BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));
PrintWriter out=new PrintWriter(server getOutputStream());
上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作 而原始的字节流来源于Socket的两个方法 getInputStream()和getOutputStream()方 分别用来得到输入和输出 那么现在有了基本的模型和基本的操作工具 我们可以做一个简单的Socket例程了
服务方:
import java io *;
import *;
public class MyServer {
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket( );
Socket client=server accept();
BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));
迅型PrintWriter out=new PrintWriter(client getOutputStream());
while(true){
String str=in readLine();
System out println(str);
out println( has receive );
out flush();
if(str equals( end ))
break;
}
client close();
}
}
这个程序的主要目的在于服务器不断接收客户机所写入的信息只到 客户机发送 End 字符串就退出程序 并且服务器也会做出 Receive 为回应 告知客户机已接收到消息
客户机代码:
import *;
import java io *;
public class Client{
static Socket server;
public static void main(String[] args)throws Exception{
server=new Socket(InetAddress getLocalHost() );
BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));
PrintWriter out=new PrintWriter(server getOutputStream());
BufferedReader wt=new BufferedReader(new InputStreamReader(System in));
while(true){
String str=wt readLine();
out println(str);
out flush();
if(str equals( end )){
break;
}
System out println(in readLine());
}
server close();
}
}
客户机代码则是接受客户键盘输入 并把该信息输出 然后输出 End 用来做退出标识
这个程序只是简单的两台计算机之间的通讯 如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端 结果是会抛出异常的 那么多个客户端如何实现呢?
其实 简单的分析一下 就可以看出客户和服务通讯的主要通道就是Socket本身 而服务器通过accept方法就是同意和客户建立通讯 这样当客户建立Socket的同时 服务器也会使用这一根连线来先后通讯 那么既然如此只要我们存在多条连线就可以了 那么我们的程序可以变为如下:
服务器:
import java io *;
import *;
public class MyServer {
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket( );
while(true){
Socket client=server accept();
BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));
PrintWriter out=new PrintWriter(client getOutputStream());
while(true){
String str=in readLine();
System out println(str);
out println( has receive );
out flush();
if(str equals( end ))
break;
}
client close();
}
}
}
这里仅仅只是加了一个外层的While循环 这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互 这里也就是接受到客户的 End 消息 那么现在就实现了多客户之间的交互了 但是 问题又来了 这样做虽然解决了多客户 可是是排队执行的 也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互 无法做到同时服务 那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了 所以线程是最好的解决方案
那么下面的问题是如何使用线程 首先要做的事情是创建线程并使得其可以和网络连线取得联系 然后由线程来执行刚才的操作 要创建线程要么直接继承Thread要么实现Runnable接口 要建立和Socket的联系只要传递引用就可以了 而要执行线程就必须重写run方法 而run方法所做的事情就是刚才单线程版本main所做的事情 因此我们的程序变成了这样:
import *;
import java io *;
public class MultiUser extends Thread{
private Socket client;
public MultiUser(Socket c){
this client=c;
}
public void run(){
try{
BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));
PrintWriter out=new PrintWriter(client getOutputStream());
//Mutil User but can t parallel
while(true){
String str=in readLine();
System out println(str);
out println( has receive );
out flush();
if(str equals( end ))
break;
}
client close();
}catch(IOException ex){
}finally{
}
}
public static void main(String[] args)throws IOException{
ServerSocket server=new ServerSocket( );
while(true){
//transfer location change Single User or Multi User
MultiUser mu=new MultiUser(server accept());
mu start();
}
}
}
lishixin/Article/program/Java/hx/201311/27013