IP of client in Server Socket Channel
how could we find the IP of clients in TCP\IP NIO Channel....
SocketChannel.socket().getInetAddress() on the accepted socket
Similar Messages
-
File transfer to multiple clients from server socket
I have multiple clients connected to my server socket and I need to copy more than 200mb documents from server to all clients over socket. Can we design the issue considering scalability and performance factor? What I am thinking of we should use thread for transferring file from server to client. But at the same time if we have large number of clients then we can't initialize a thread for each client. I think in this case we should initialize less than 10 threads in the pool as the file size is very large. If we keep number of threads in the pool low then probably we have to read multiple times the large server file (once for each group) which might again be a performance bottleneck. Please pour in your suggestions.
File would be same for an instance only. For example say I have a "SEND File" button & �File Path� text box. In File Path suppose user enters the absolute path of the file and then clicks on Send File button. The responsibility of Send File button would be sending the file mentioned in the "File Path" text box to all connected client. But next time user can choose a different file.
-
We sometimes see this failure intermitently when using the FlexUnit Ant task to run tests in a CI environment. The Ant task throws this exception:
java.util.concurrent.ExecutionException: could not close client/server socket
I have seen this for a while now, and still see it with the latest 4.1 RC versions.
Here is the console output seen along with the above exception:
FlexUnit player target: flash
Validating task attributes ...
Generating default values ...
Using default working dir [C:\DJTE\commons.formatter_swc\d3flxcmn32\extracted\Source\Flex]
Using the following settings for the test run:
FLEX_HOME: [C:\dev\vert-d3flxcmn32\302100.41.0.20110323122739_d3flxcmn32]
haltonfailure: [false]
headless: [false]
display: [99]
localTrusted: [true]
player: [flash]
port: [1024]
swf: [C:\DJTE\commons.formatter_swc\d3flxcmn32\extracted\build\commons.formatter.tests.unit.sw f]
timeout: [1800000ms]
toDir: [C:\DJTE\commons.formatter_swc\d3flxcmn32\reports\xml]
Setting up server process ...
Entry [C:\DJTE\commons.formatter_swc\d3flxcmn32\extracted\build] already available in local trust file at [C:\Users\user\AppData\Roaming\Macromedia\Flash Player\#Security\FlashPlayerTrust\flexUnit.cfg].
Executing 'rundll32' with arguments:
'url.dll,FileProtocolHandler'
'C:\DJTE\commons.formatter_swc\d3flxcmn32\extracted\build\commons.formatter.tests.unit.swf '
The ' characters around the executable and arguments are
not part of the command.
Starting server ...
Opening server socket on port [1024].
Waiting for client connection ...
Client connected.
Setting inbound buffer size to [262144] bytes.
Receiving data ...
Sending acknowledgement to player to start sending test data ...
Stopping server ...
End of test data reached, sending acknowledgement to player ...
When the problem occurs, it is not always during the running of any particular test (that I am aware of). Recent runs where this failure was seen had the following number of tests executed (note: the total number that should be run is 45677): 18021, 18, 229.
Here is a "good" run when the problem does not occur:
Setting inbound buffer size to [262144] bytes.
Receiving data ...
Sending acknowledgement to player to start sending test data ...
Stopping server ...
End of test data reached, sending acknowledgement to player ...
Closing client connection ...
Closing server on port [1024] ...
Analyzing reports ...
Suite: com.formatters.help.TestGeographicSiteUrls
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 sec
Suite: com.formatters.functionalUnitTest.testCases.TestNumericUDF
Tests run: 13, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.071 sec
Results :
Tests run: 45,677, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 201.186 sec
Has anyone else ran across this problem?
Thanks,
TrevorI am not sure if this information will help everyone, but here goes...
For us, these problems with FlexUnit tests crashing the Flash Player appear to be related to couple of factors. Recently, we moved up from Flex 3.2 to Flex 4.1 as our development baseline. Many people complained that their development environment (Flash Builder, etc.) was much more unstable. Apparently, 4.1 produces SWFs that require more memory to run than 3.2 does? Anyway, we still had Flash Player 10.1 as our runtime baseline. Apparently, that version of the player was not as capable of running larger FlexUnit test SWFs, and would crash (as I posted months earlier). I upgraded to the latest 10.3 standalone player versions, and the crashes have now ceased. It would be nice to know exactly what was causing the crashes, but memory management (or lack of) is my best guess.
So, if you are seeing these issues, try upgrading to the latest Flash Player version.
Regards,
Trevor -
How to detect client socket shutdowns in server socket
Hi,
Hoping to get some help with this. I am writing this program that implements a socket server that accepts a single client socket (from a third-party system). This server receives messages from another program and writes them to the client socket. It does not read anything back from the client. However, the client (which I have no control over) disconnects and reconnects to my server at random intervals. My issue is I cannot detect when the client has disconnected (normally or due to a network failure), hence am unable to accept a fresh connection from the client. Here's my code for the server.
ServerSocket serverSocket = null;
Socket clientSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try{
if (serverSocket == null){
serverSocket = new ServerSocket(4511);
clientSocket = serverSocket.accept();
System.out.println("Accepted client request ... ");
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
System.out.println("Input / Output streams intialized ...");
while (true){
System.out.println("Is Client Socket Closed : " + clientSocket.isClosed());
System.out.println("Is Client Socket Connected : " + clientSocket.isConnected());
System.out.println("Is Client Socket Bound : " + clientSocket.isBound());
System.out.println("Is Client Socket Input Shutdown : " + clientSocket.isInputShutdown());
System.out.println("Is Client Socket Output Shutdown : " + clientSocket.isOutputShutdown());
System.out.println("Is Server Socket Bound : " + serverSocket.isBound());
System.out.println("Is Server Socket Closed : " + serverSocket.isClosed());
messageQueue = new MessageQueue(messageQueueDir+"/"+messageQueueFile);
//get Message from Queue Head (also removes it)
message = getQueueMessage(messageQueue);
//format and send to Third Party System
if (message != null){
out.println(formatMessage(message));
System.out.println("Sent to Client... ");
//sleep
System.out.println("Going to sleep 5 sec");
Thread.sleep(5000);
System.out.println("Wake up ...");
}catch(IOException ioe){
System.out.println("initSocketServer::IOException : " + ioe.getMessage());
}catch(Exception e){
System.out.println("initSocketServer::Exception : " + e.getMessage());
}I never use the client's inputstream to read, although I have declared it here. After the client is connected (it enters the while loop), it prints the following. These values stay the same even after the client disconnects.
Is Client Socket Closed : false
Is Client Socket Connected : true
Is Client Socket Bound : true
Is Client Socket Input Shutdown : false
Is Client Socket Output Shutdown : false
Is Server Socket Bound : true
Is Server Socket Closed : false
So, basically I am looking for a condition that detects that the client is no longer connected, so that I can bring serverSocket.accept() and in and out initializations within the while loop.
Appreciate much, thanks.Crossposted and answered.
-
Can i run UDP client and UDP server socket program in the same pc ?
hi all.
when i execute my UDP client socket program and UDP server socket program in the same pc ,
It's will shown the error msg :
"Address already in use: Cannot bind"
but if i run UDP client socket program in the remote pc and UDP server socket program run in local pc , it's will success.
anybody know what's going on ?
any help will be appreciated !bobby92 wrote:
i have use a specified port for UDP server side , and for client define the server port "DatagramSocket clientSocket= new DatagramSocket(Server_PORT);"Why? The port you provide here is not the target port. It's the local port you listen on. That's only necessary when you want other hosts to connect to you (i.e. when you're acting as a server).
The server should be using that constructor, the client should not be specifying a port.
so when i start the udp server code to listen in local pc , then when i start UDP client code in local pc ,i will get the error "Address already in use: Cannot bind"Because your client tries to bind to the same port that the server already bound to. -
Socket communication between client and server
Hi all,
I am doing an assignment for communication between java client and java server using sockets. This communication is in the form of XML documents. I am facing a problem in this communication.
Actually at Server side I'm creating an XML document(Document type object) using DocumentBuilderFactory in javax.xml.parsers package and transforming this Document into a stream using StreamResult.
My code is :
Transformer xmlTransformer = TransformerFactory.newInstance().newTransformer();
StreamResult xmlString = new StreamResult(currentClientHandler.getSocketOutputStream());
DOMSource xmlDocSource = new DOMSource(xmlDocument); // xmlDocument is Document type reference
xmlTransformer.transform(xmlDocSource, xmlString);
so, this xmlString(i.e. StreamResult) is passed directly into the output stream. Here I need to close() output stream after transform() call to help SAX parser to know about end of stream.
Now at Client side, I am parsing this stream using SAX parser. It parses this correctly. But when sending some another data back to Server when client opens output stream, it given Socket closed exception. I know that closing input or output stream closes socket. But in my problem, I have to send data in streams and not by using files or byte[] etc.
So what is nearest solution to problem ??
Plz help me. Any kind of help will be greatly appreciated.hi
thanks for ur reply.
I didnt get any error msg while getting the back the datas.
Actually i divided my application into two parts.
My application will act as both server and client.
server ll get the browser request and send to the client and the client will send that data to the c++ server.
Im able to do that.and unable to get the data from server.
Didnt get any error.
can u tell me how to make an application to act as both client and server.
I think im wrong in that part.
thanks a lot -
Should i create a client and a server socket in a same application
Greetings,
In which situation sould i have a server socket ? and in which situation should i have a client socket ?and in which situation should i have both?
I 'm making a app. who receives info (like alarms ) from a automation machine and also that same app. as a scheduler who send commands according to dates to the automation machine.
Now the automation machine is programmed like a socket tcp/ip server who is always on and the app. is a client.
Every time there's an alarm the machine sends me the info and i put it in a mysql database.
Every time there's an event programmed the app. sends a string to the machine.
The question is that i can't maintain that socket always connected, Sometimes disconnets.
I was thinking of making the change of creating in both sides a server and a client, so that, for example, in the app. the client woul d handle the event msgs and the server would accecpt connections with alarms from the automaition machine.
Since i'm a newbie in Java could somebody give me some tips, please?
ThanksThanks Peter....
But i already do that....
I have a thread who handles the connection management.
If by some reaseon the connection is lost the thread reconnects it.
My problem is that sometimes it reconnects every second, and i loose info provided by the automatian machine.
The best thing to have it would be a socket listener, but Java does have any.
Is there any API that does a socket listener? -
Client/server socket based application
hi does anyone have example of client/server socket based application using Spring and Maven
where application do the following
Client sends a request with a path to any file on the server
„h Server reads the file and responds back with the content
„h Client outputs the content to the console
am trying to follow this
http://www2.sys-con.com/itsg/virtualcd/java/archives/0205/dibella/index.html
http://syntx.io/a-client-server-application-using-socket-programming-in-java/
am using java 6i have attempt code but i wht to do the following
client/server socket based application that will read the content of a file and stream the content of the file to the client. The client must simply output the content of the file to the console using System.out. The client must be able to run in a standalone mode (non-network mode) or in a remote mode.
Additionally the client must be designed in a way that i can print the output to a console but must be interchangeable where if requirements change i can persist the response to file or persist the response to a database.
/* Server.java*/
///ifgetBoolen= true then...
import java.io.*;
import java.net.*;
import java.util.*;
import java.sql.*;
public class Server
static String array[][];
// STEP 1 a1
// Server socket
ServerSocket listener;
// STEP 1 a2 Client connection
Socket client;
ObjectInputStream in;
ObjectOutputStream out;
public void createConnection() throws IOException
System.out.println("\nSERVER >>> Waiting for connection.....");
client = listener.accept();
String IPAddress = "" + client.getInetAddress();
DisplayMessage("SERVER >>> Connected to " + IPAddress.substring(1,IPAddress.length()));
public void runServer()
// Start listening for client connections
// STEP 2
try
listener = new ServerSocket(12345, 10);
createConnection();
// STEP 3
// processConnection();
catch(IOException ioe)
DisplayMessage("SERVER >>> Error trying to listen: " + ioe.getMessage());
private void closeConnection()
DisplayMessage("SERVER >>> Terminating connections");
try
if(out != null && in != null)
out.close();
in.close();
client.close();
catch(IOException ioe)
DisplayMessage("SERVER >>> Closing connections");
public static void define2DArray(ResultSet RS, int Size)
try
ResultSetMetaData RMSD = RS.getMetaData();
DisplayMessage("SERVER >>> Requested arraySize: " + Size);
if (RS.next())
array = new String[Size][RMSD.getColumnCount()];
for (int Row = 0; Row < Size; Row++)
for (int Col = 0; Col < RMSD.getColumnCount(); Col++)
array[Row][Col] = new String();
array[Row][Col] = RS.getString(Col+1);
DisplayMessage(array[Row][Col] + " ");
RS.next();
else
array = new String[1][1];
array[0][0] = "#No Records";
catch (Exception e)
DisplayMessage("SERVER >>> Error in defining a 2DArray: " + e.getMessage());
public static void DisplayMessage(final String IncomingSMS)
System.out.println(IncomingSMS);
//client
* @author
import java.io.*;
import java.net.*;
import javax.swing.*;
public class ClientSystem
static Socket server;
static ObjectOutputStream out;
static ObjectInputStream in;
static String Response[][];
static boolean IsConnected = false;
static int Num = 0;
public static void connectToServer() throws IOException
server = new Socket("127.0.0.1", 12345);
// server = new Socket("000.00.98.00", 12345);
String IPAddress = "" + server.getInetAddress();
DisplayMessage("\nCLIENT >>> Connected to " + IPAddress.substring(1,IPAddress.length()));
public static void getStreams() throws IOException
out = new ObjectOutputStream(server.getOutputStream());
out.flush();
in = new ObjectInputStream(server.getInputStream());
IsConnected = true;
DisplayMessage("CLIENT >>> Got I/O streams");
public static void runClient()
try
connectToServer();
getStreams();
DisplayMessage("CLIENT >>> Connection successfull....\n");
DisplayMessage("CLIENT >>> Want to talk to server");
catch (IOException ioe)
System.out.print("."+Num);
Num++;
public static void closeConnection()
try
out.close();
in.close();
server.close();
catch(IOException error)
DisplayMessage("CLIENT >>> Could not close connections");
public static void Start()
System.out.print("\nCLIENT >>> Attempting connection.....");
try
IsConnected = false;
while (IsConnected == false)
runClient();
if (IsConnected == false)
Thread.sleep(100);
catch (Exception e)
DisplayMessage("CLIENT >>> Attempting connection.....");
public static String sendSMS(String sms)
Response = new String[0][0];
try
DisplayMessage("CLIENT >>> " + sms);
out.writeObject(sms);
out.flush();
Response = (String[][])in.readObject();
DisplayMessage("CLIENT >>> Waiting for server to respond...");
for (int Row = 0; Row < Response.length; Row++)
System.out.printf( "_SERVER >>> \t");
for (int Col = 0; Col < Response[Row].length; Col++)
//DisplayMessage( "_SERVER >>> " + Response[Row][Col] + " ");
System.out.printf( "%s\t", Response[Row][Col]);
System.out.println();
DisplayMessage("CLIENT >>> Query processed successfully....\n");
catch(ClassNotFoundException cnfe)
DisplayMessage("CLIENT >>> Class not found for casting received object");
catch(IOException ioe)
reConnect();
catch (Exception sqle)
DisplayMessage("CLIENT >>> Error sending query ??? " + sqle.getMessage());
return "transmission successfull";
public static void reConnect()
try
DisplayMessage("CLIENT >>> Connection was lost. Trying to reconnect...");
closeConnection();
Thread.sleep(100);
IsConnected = false;
while (IsConnected == false)
runClient();
Thread.sleep(200);
catch (Exception e)
DisplayMessage("CLIENT >>> Error trying to Re-Connect...");
public static void DisplayMessage(final String IncomingSms)
System.out.println(IncomingSms);
System.out.printf("Isms: %s", IncomingSms); ///naah.
public static String[][] getResponse()
return Response;
public static String getResponse(int row, int col)
return Response[row][col];
how can i do below using above code
The program must be able to work in a non-networked mode. In this mode, the server and client must run in the same VM and must perform no networking, must not use loopback networking i.e: no “localhost” or “127.0.0.1”, and must not involve the serialization of any objects when communicating between the client and server components.
The operating mode is selected using the single command line argument that is permitted.
imust use a socket connection and define a protocol. networking must be entirely bypassed in the non-network mode. -
Hi,
As the name of the forum suggests I am very new to this whole thing.
I am trying to write a client/server socket program that can encrypt and decrypt and has a GUI, can't use JCE or SSL or any built in encryption tools.
I have the code for everything cept the encryption part.
Any help, greatly appreciated,tnks a million but how do i incorporate that into the following client and server code:
here's the client code:
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
class SocketClient extends JFrame
implements ActionListener {
JLabel text, clicked;
JButton button;
JPanel panel;
JTextField textField;
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
SocketClient(){ //Begin Constructor
text = new JLabel("Text to send over socket:");
textField = new JTextField(20);
button = new JButton("Click Me");
button.addActionListener(this);
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBackground(Color.white);
getContentPane().add(panel);
panel.add("North", text);
panel.add("Center", textField);
panel.add("South", button);
} //End Constructor
public void actionPerformed(ActionEvent event){
Object source = event.getSource();
if(source == button){
//Send data over socket
String text = textField.getText();
out.println(text);
textField.setText(new String(""));
//Receive text from server
try{
String line = in.readLine();
System.out.println("Text received :" + line);
} catch (IOException e){
System.out.println("Read failed");
System.exit(1);
public void listenSocket(){
//Create socket connection
try{
socket = new Socket("HUGHESAN", 4444);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (UnknownHostException e) {
System.out.println("Unknown host: HUGHESAN.eng");
System.exit(1);
} catch (IOException e) {
System.out.println("No I/O");
System.exit(1);
public static void main(String[] args){
SocketClient frame = new SocketClient();
frame.setTitle("Client Program");
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
frame.addWindowListener(l);
frame.pack();
frame.setVisible(true);
frame.listenSocket();
SERVER Code
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
class SocketServer extends JFrame
implements ActionListener {
JButton button;
JLabel label = new JLabel("Text received over socket:");
JPanel panel;
JTextArea textArea = new JTextArea();
ServerSocket server = null;
Socket client = null;
BufferedReader in = null;
PrintWriter out = null;
String line;
SocketServer(){ //Begin Constructor
button = new JButton("Click Me");
button.addActionListener(this);
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBackground(Color.white);
getContentPane().add(panel);
panel.add("North", label);
panel.add("Center", textArea);
panel.add("South", button);
} //End Constructor
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if(source == button){
textArea.setText(line);
public void listenSocket(){
try{
server = new ServerSocket(4444);
} catch (IOException e) {
System.out.println("Could not listen on port 4444");
System.exit(-1);
try{
client = server.accept();
} catch (IOException e) {
System.out.println("Accept failed: 4444");
System.exit(-1);
try{
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
} catch (IOException e) {
System.out.println("Accept failed: 4444");
System.exit(-1);
while(true){
try{
line = in.readLine();
//Send data back to client
out.println(line);
} catch (IOException e) {
System.out.println("Read failed");
System.exit(-1);
protected void finalize(){
//Clean up
try{
in.close();
out.close();
server.close();
} catch (IOException e) {
System.out.println("Could not close.");
System.exit(-1);
public static void main(String[] args){
SocketServer frame = new SocketServer();
frame.setTitle("Server Program");
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
frame.addWindowListener(l);
frame.pack();
frame.setVisible(true);
frame.listenSocket();
Again help on this is very welcomed -
BEA-002606 Unable to create a server socket for listening on channel
Hi,
I am trying to stand up JDEVELOPER suite 11.1.2 on Windows 7 64 Bit.
When I sreate a sample app and try to compile, I get the error:
<Error> <Server> <BEA-002606> <Unable to create a server socket for listening on channel "DefaultSecure". The address 192.168.56.101 might be incorrect or another process is using port 7102: java.net.BindException: Cannot assign requested address: JVM_Bind.>
This IP is not active on my machine, although it was initialized at one point through a VBox instance I installed. I have tried to clean off the VBOX instance and the JDEVELOPER, rebooting between loads. Can anyone help me get what look like a ghost IP off my machine. Note: I set the weblogic server to port 8003, so I am also not sure why itis looking at port 7002.
Thanks
JTIt is the integrated server. I have taken everything off (JDev adn VBOX) and cleaned some of the hard to find file structures just to make sure there wasn't a hidden config file I was missing.
I am new to Web Logic, so I was hoping to get the integrated server running first and then learn the ins and outs of deployment to a production system. -
How to handle when Client and server write to the socket at the same time
Hi all,
I'm writing a socket communication when client and server may write information the the socket at the same time. I look every where but the samples from the internet only shows example of server replies to client after receiving requests from clients.
Let's say that:
Client 1 ->Socket 1 -> Server 1
Now if there are two threads in the server, one blocked waiting for the input from client on socket 1, the second one write something on the socket to client 1, is it possible?
And if it's possible, if at the time Server 1 writes information to Client 1, Client 1 writes some information to Server 1 too, will there be any conflict problem or the socket could handle that two ways communication simultaneously?
It's critical questions for me. Thanks for your help.I really use Server Client paradigm. However, beside the request, response mechanism, there is also an additional mechanism called update which server periodically send information update to client without the need for a request from client.
So you suggest client should initiate 2 sockets, one for request and response, one for receiving update from the server? Will this work? -
Client / Server Socket Communication - Should use 2 ports?
If we have a client server architecture using a socket based connection, should there be 2 serperate sockets? One dedicated to sending and one dedictated to receiving? What happens if both the client and server both send at the same time? How does that get handled? Does one of the messages get dropped? Thanks...
There are of course reasons you might want to use two sockets.
For instance security. One socket is encrypted and the other isn't. Or because the server initiates a confirmed port connection back it verifies the IP.
Or because the main socket is used for control and the second one is used for data. That way the client can tell the server to pause or make other adjustments in the data while the data is still flowing. -
How to run a datagram socket client and server program
hi,
I am new to socket programming. I am following the tutorial of sun for socket programming...The link is
http://java.sun.com/docs/books/tutorial/networking/datagrams/clientServer.html
I have understood the concept, but the problem is i cannot run the program. I am using netbeans and i have created a package and stored the files QuoteServer,QuoteServerThread, QuoteClient in this package. How can i make the server program run first and then client program in netbeans
kindly help me
ThankyouI think you are trying to run both server and client
on one machine!!!
It is impossible, your server is blocking the port to
send packets, so you must run client on another
computer!!!It's not impossible to run a client and server on the same machine just for testing or as a demo. Just have the server listen on one port and the client use a different port.
No need to use 2 seperate computers. I've done it one computer before without a problem.
Nick -
Socket Exception when closing Server Socket Streams if Client closes first
Hi
I have 2 processes - a Server socket and a client socket. If I close the Client process first, and then try closing down the Streams on the Server process, I get a SocketException with message "Socket is closed" when I try and close the 2nd Stream. It does not matter on the order of the Stream being closed down, the exception is always thrown when I try and close the second stream. The code snippets are below:
SERVER =======
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketTest {
public static void main(String args[]) {
try {
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept();
// Get refs to streams...
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
// sleep to let client shutdown first...
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.err.println(e);
System.err.println("B4 inClose: isBound=" + s.isBound());
System.err.println("B4 inClose: isClosed=" + s.isClosed());
System.err.println("B4 inClose: isConnected=" + s.isConnected());
System.err.println("B4 inClose: isInputShutdown=" + s.isInputShutdown());
System.err.println("B4 inClose: isOutputShutdown=" + s.isOutputShutdown());
s.getInputStream().close();
System.err.println("After inClose: isBound=" + s.isBound());
System.err.println("After inClose: isClosed=" + s.isClosed());
System.err.println("After inClose: isConnected=" + s.isConnected());
System.err.println("After inClose: isInputShutdown=" + s.isInputShutdown());
System.err.println("After inClose: isOutputShutdown=" + s.isOutputShutdown());
s.getOutputStream().close(); // will break here with SocketException!
System.err.println("After outClose: isBound=" + s.isBound());
System.err.println("After outClose: isClosed=" + s.isClosed());
System.err.println("After outClose: isConnected=" + s.isConnected());
System.err.println("After outClose: isInputShutdown=" + s.isInputShutdown());
System.err.println("After outClose: isOutputShutdown=" + s.isOutputShutdown());
s.close();
} catch (Exception e) {
System.err.println(e);
CLIENT ======
import java.net.Socket;
public class ClientSocket {
public static void main(String args[]) {
try {
Socket s = new Socket("localhost", 9999);
try {
// sleep to leave connection up for a while...
Thread.sleep(2000);
} catch (InterruptedException e) {
System.err.println(e);
s.close();
} catch (Exception e) {
System.err.println(e);
The debug shows that isClosed() is set to 'true' after the first call to s.getInputStream().close(). The Sun API Socket class getOutputStream() has a call to isClosed() at the start of the method - it then throws the SocketException that I get. Why does the SocketImpl do this before I get a chance to call a.getOutputStream().close()?
One final thing, the calls to s.isInputShutdown() and s.isOuputShutdown always seem to return false even if the Streams have had their .close() method called.
Any ideas/help here greatly appreciated.
Thanks
GazOk, I know what's going on now - I needed something to do on Friday afternoon anyhow!
Basically if you call either getOutputStream.close() or getInputStream().close(), the underlying Sun implementation will close the Socket.
Here's what's happening under the covers in the Sun code:
s.getInputStream() is called on the Socket class.
The Socket class holds a reference to the SocketImpl class.
The SocketImpl class is abstract and forces sublclasses to extend it' s getInputStream() method.
The PlainSocketImpl extends SocketImpl.
PlainSocketImpl has a getInputStream() method that returns a SocketInputStream. When the stream is created for the first time, the PlainSocketImpl object is passed into the Constructor.
The SocketInputStream class has a close() method on it. The snippet of code below shows how the socket is closed:
<pre>
* Closes the stream.
private boolean closing = false;
public void close() throws IOException {
// Prevent recursion. See BugId 4484411
if (closing)
return;
closing = true;
if (socket != null) {
if (!socket.isClosed())
socket.close();
} else
impl.close();
closing = false;
</pre>
So, it seems that out PlainSocketImpl is getting closed for us, hence the SocketException being thrown in Socket.getOutputStream() when I call it after Socket.getInputStream()/
I've not had a look at the reason why the calls to s.isInputShutdown() and s.isOuputShutdown always seem to return false even if the Streams have had their .close() method called though - any thoughts appreciated.
Thanks
G -
Interesting! C client socket communicating with java server sockets after..
Hi,
I have a client(in C) open a socket and server(in java; jvm 1.2) listening on the same port(e.g. 4444) accepts the request and establishes a socket conn. Now the sockets are kept open indefinitely. If I kill the server process and bring it backup, the client(in C) cannot communicate with the server(in java).
Why would this be happening? Aren't the server socket garbage collected?
How do I make sure that the next time I bring up the server again, the client communicates with it.
Any inputs is really appreciated.
thanks
atul.Check the client is closing the connection before it stops.
I've had similar problems with JDBC before where if you don't explicitly close the connection it remains bound to the port, hence if your client only ever tries to connect to that port it will fail.
I think.
MrChris
Maybe you are looking for
-
Getting errors while writing to a BLOB column using PrepareStatement
Hello, I am getting the following errors when I am trying to insert in a BLOB in the oracle 9i database: java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1 ORA-06502: PL/SQL: numeric or value error ORA-06512: at line 205 ORA-22
-
Trouble loading external .SWF into my main page with preloaders
Dear All, I am working on my first Flash project with AS3. The structure of the flash site is pretty simple. I have a stage 1165px wide x 710px height Inside my Stage I have an horizontal bar with a menu followed by a container right under. **** My g
-
I just started using Safari, using Safari 5.1 on Win XP. Any place where there used to be a check box, there's now a little button with a triangle on it. The triangle changes orientation as I move the mouse cursor around, but there is no visible ch
-
Info about Tax on sales/purchase from a business perspective
Hello everybody, Where could I find information about tax on sales/purchase? I am especially looking for info from a business perspective. The questions I try to answer are, for example, the followings: - What are the main business issues regarding V
-
When I answer a report it shows me the first e.g. 25 rows, as defined. When I print this report it will print also this 25 rows :-( I'd like to force Oracle BI EE that it will print in any case the complete report. Is this possible? How can I set thi